aboutsummaryrefslogtreecommitdiff
path: root/legacy
diff options
context:
space:
mode:
authorAnton Tananaev <anton@traccar.org>2024-04-06 09:17:52 -0700
committerAnton Tananaev <anton@traccar.org>2024-04-06 09:17:52 -0700
commitb392a4af78e01c8e0f50aad5468e9583675b24be (patch)
tree0a4fd7c4ee020e0829817853469979d4e998a69a /legacy
parent94cadecda794358a53995c276697919eaf540466 (diff)
downloadtrackermap-web-b392a4af78e01c8e0f50aad5468e9583675b24be.tar.gz
trackermap-web-b392a4af78e01c8e0f50aad5468e9583675b24be.tar.bz2
trackermap-web-b392a4af78e01c8e0f50aad5468e9583675b24be.zip
Move to the legacy folder
Diffstat (limited to 'legacy')
-rw-r--r--legacy/.eslintignore4
-rw-r--r--legacy/.eslintrc.json61
-rw-r--r--legacy/LICENSE.txt674
-rw-r--r--legacy/package-lock.json3017
-rw-r--r--legacy/package.json18
-rw-r--r--legacy/web/app.css62
-rw-r--r--legacy/web/app.js21
-rw-r--r--legacy/web/app/Application.js246
-rw-r--r--legacy/web/app/AttributeFormatter.js311
-rw-r--r--legacy/web/app/DeviceImages.js99
-rw-r--r--legacy/web/app/GeofenceConverter.js101
-rw-r--r--legacy/web/app/Style.js95
-rw-r--r--legacy/web/app/controller/Root.js363
-rw-r--r--legacy/web/app/model/Attribute.js33
-rw-r--r--legacy/web/app/model/Calendar.js34
-rw-r--r--legacy/web/app/model/Command.js40
-rw-r--r--legacy/web/app/model/ComputedAttribute.js39
-rw-r--r--legacy/web/app/model/Device.js64
-rw-r--r--legacy/web/app/model/Driver.js35
-rw-r--r--legacy/web/app/model/Event.js81
-rw-r--r--legacy/web/app/model/Geofence.js40
-rw-r--r--legacy/web/app/model/Group.js34
-rw-r--r--legacy/web/app/model/KnownAttribute.js35
-rw-r--r--legacy/web/app/model/KnownCommand.js34
-rw-r--r--legacy/web/app/model/KnownNotification.js32
-rw-r--r--legacy/web/app/model/KnownNotificator.js32
-rw-r--r--legacy/web/app/model/Maintenance.js41
-rw-r--r--legacy/web/app/model/Notification.js40
-rw-r--r--legacy/web/app/model/Position.js72
-rw-r--r--legacy/web/app/model/ReportStop.js58
-rw-r--r--legacy/web/app/model/ReportSummary.js61
-rw-r--r--legacy/web/app/model/ReportTrip.js77
-rw-r--r--legacy/web/app/model/Server.js88
-rw-r--r--legacy/web/app/model/Statistics.js59
-rw-r--r--legacy/web/app/model/User.js101
-rw-r--r--legacy/web/app/store/AlarmTypes.js34
-rw-r--r--legacy/web/app/store/AllCalendars.js30
-rw-r--r--legacy/web/app/store/AllCommandTypes.js32
-rw-r--r--legacy/web/app/store/AllCommands.js30
-rw-r--r--legacy/web/app/store/AllComputedAttributes.js30
-rw-r--r--legacy/web/app/store/AllDevices.js29
-rw-r--r--legacy/web/app/store/AllDrivers.js30
-rw-r--r--legacy/web/app/store/AllGeofences.js29
-rw-r--r--legacy/web/app/store/AllGroups.js29
-rw-r--r--legacy/web/app/store/AllMaintenances.js30
-rw-r--r--legacy/web/app/store/AllNotificationTypes.js32
-rw-r--r--legacy/web/app/store/AllNotifications.js29
-rw-r--r--legacy/web/app/store/AllNotificators.js32
-rw-r--r--legacy/web/app/store/AllTimezones.js798
-rw-r--r--legacy/web/app/store/AttributeValueTypes.js33
-rw-r--r--legacy/web/app/store/Attributes.js25
-rw-r--r--legacy/web/app/store/Calendars.js30
-rw-r--r--legacy/web/app/store/CommandTypes.js32
-rw-r--r--legacy/web/app/store/Commands.js30
-rw-r--r--legacy/web/app/store/CommonDeviceAttributes.js32
-rw-r--r--legacy/web/app/store/CommonUserAttributes.js90
-rw-r--r--legacy/web/app/store/ComputedAttributes.js30
-rw-r--r--legacy/web/app/store/CoordinateFormats.js56
-rw-r--r--legacy/web/app/store/DeviceAttributes.js52
-rw-r--r--legacy/web/app/store/DeviceCommands.js32
-rw-r--r--legacy/web/app/store/DeviceImages.js37
-rw-r--r--legacy/web/app/store/DeviceStatuses.js35
-rw-r--r--legacy/web/app/store/Devices.js29
-rw-r--r--legacy/web/app/store/DistanceUnits.js53
-rw-r--r--legacy/web/app/store/Drivers.js30
-rw-r--r--legacy/web/app/store/EventPositions.js31
-rw-r--r--legacy/web/app/store/Events.js29
-rw-r--r--legacy/web/app/store/GeofenceAttributes.js38
-rw-r--r--legacy/web/app/store/GeofenceTypes.js32
-rw-r--r--legacy/web/app/store/Geofences.js29
-rw-r--r--legacy/web/app/store/GroupAttributes.js32
-rw-r--r--legacy/web/app/store/Groups.js29
-rw-r--r--legacy/web/app/store/HoursUnits.js43
-rw-r--r--legacy/web/app/store/KnownCommands.js241
-rw-r--r--legacy/web/app/store/Languages.js34
-rw-r--r--legacy/web/app/store/LatestPositions.js21
-rw-r--r--legacy/web/app/store/MaintenanceTypes.js22
-rw-r--r--legacy/web/app/store/Maintenances.js30
-rw-r--r--legacy/web/app/store/MapTypes.js56
-rw-r--r--legacy/web/app/store/Notifications.js29
-rw-r--r--legacy/web/app/store/PositionAttributes.js269
-rw-r--r--legacy/web/app/store/Positions.js29
-rw-r--r--legacy/web/app/store/ReportChartTypes.js33
-rw-r--r--legacy/web/app/store/ReportEventTypes.js26
-rw-r--r--legacy/web/app/store/ReportEvents.js35
-rw-r--r--legacy/web/app/store/ReportPeriods.js45
-rw-r--r--legacy/web/app/store/ReportRoute.js35
-rw-r--r--legacy/web/app/store/ReportStops.js36
-rw-r--r--legacy/web/app/store/ReportSummary.js36
-rw-r--r--legacy/web/app/store/ReportTrips.js36
-rw-r--r--legacy/web/app/store/ReportTypes.js44
-rw-r--r--legacy/web/app/store/ServerAttributes.js23
-rw-r--r--legacy/web/app/store/SpeedUnits.js53
-rw-r--r--legacy/web/app/store/Statistics.js26
-rw-r--r--legacy/web/app/store/TimeUnits.js44
-rw-r--r--legacy/web/app/store/UserAttributes.js70
-rw-r--r--legacy/web/app/store/Users.js29
-rw-r--r--legacy/web/app/store/VisibleDevices.js22
-rw-r--r--legacy/web/app/store/VolumeUnits.js57
-rw-r--r--legacy/web/app/view/ArrayListFilter.js50
-rw-r--r--legacy/web/app/view/BaseWindow.js32
-rw-r--r--legacy/web/app/view/ClearableComboBox.js31
-rw-r--r--legacy/web/app/view/ColorPicker.js43
-rw-r--r--legacy/web/app/view/CustomNumberField.js109
-rw-r--r--legacy/web/app/view/CustomTimeField.js30
-rw-r--r--legacy/web/app/view/DeviceMenu.js72
-rw-r--r--legacy/web/app/view/DeviceMenuController.js134
-rw-r--r--legacy/web/app/view/Events.js117
-rw-r--r--legacy/web/app/view/EventsController.js126
-rw-r--r--legacy/web/app/view/GridPanel.js34
-rw-r--r--legacy/web/app/view/Main.js84
-rw-r--r--legacy/web/app/view/MainController.js26
-rw-r--r--legacy/web/app/view/MainMobile.js73
-rw-r--r--legacy/web/app/view/Report.js115
-rw-r--r--legacy/web/app/view/ReportController.js678
-rw-r--r--legacy/web/app/view/SettingsMenu.js111
-rw-r--r--legacy/web/app/view/SettingsMenuController.js176
-rw-r--r--legacy/web/app/view/State.js85
-rw-r--r--legacy/web/app/view/StateController.js216
-rw-r--r--legacy/web/app/view/Statistics.js93
-rw-r--r--legacy/web/app/view/StatisticsController.js29
-rw-r--r--legacy/web/app/view/TouchFix62.js48
-rw-r--r--legacy/web/app/view/UnescapedTextAreaField.js29
-rw-r--r--legacy/web/app/view/UnescapedTextField.js29
-rw-r--r--legacy/web/app/view/dialog/Attribute.js65
-rw-r--r--legacy/web/app/view/dialog/AttributeController.js126
-rw-r--r--legacy/web/app/view/dialog/Base.js32
-rw-r--r--legacy/web/app/view/dialog/BaseEdit.js46
-rw-r--r--legacy/web/app/view/dialog/BaseEditController.js61
-rw-r--r--legacy/web/app/view/dialog/Calendar.js63
-rw-r--r--legacy/web/app/view/dialog/CalendarController.js37
-rw-r--r--legacy/web/app/view/dialog/ComputedAttribute.js84
-rw-r--r--legacy/web/app/view/dialog/ComputedAttributeController.js45
-rw-r--r--legacy/web/app/view/dialog/Device.js99
-rw-r--r--legacy/web/app/view/dialog/DeviceAccumulators.js55
-rw-r--r--legacy/web/app/view/dialog/DeviceAccumulatorsController.js48
-rw-r--r--legacy/web/app/view/dialog/DeviceController.js29
-rw-r--r--legacy/web/app/view/dialog/Driver.js46
-rw-r--r--legacy/web/app/view/dialog/Geofence.js89
-rw-r--r--legacy/web/app/view/dialog/GeofenceController.js58
-rw-r--r--legacy/web/app/view/dialog/Group.js55
-rw-r--r--legacy/web/app/view/dialog/Login.js151
-rw-r--r--legacy/web/app/view/dialog/LoginController.js132
-rw-r--r--legacy/web/app/view/dialog/Maintenance.js75
-rw-r--r--legacy/web/app/view/dialog/MaintenanceController.js65
-rw-r--r--legacy/web/app/view/dialog/MapPickerController.js42
-rw-r--r--legacy/web/app/view/dialog/Notification.js95
-rw-r--r--legacy/web/app/view/dialog/NotificationController.js53
-rw-r--r--legacy/web/app/view/dialog/Register.js67
-rw-r--r--legacy/web/app/view/dialog/RegisterController.js44
-rw-r--r--legacy/web/app/view/dialog/ReportConfig.js136
-rw-r--r--legacy/web/app/view/dialog/ReportConfigController.js99
-rw-r--r--legacy/web/app/view/dialog/SavedCommand.js83
-rw-r--r--legacy/web/app/view/dialog/SavedCommandController.js99
-rw-r--r--legacy/web/app/view/dialog/SelectDevice.js59
-rw-r--r--legacy/web/app/view/dialog/SelectDeviceController.js45
-rw-r--r--legacy/web/app/view/dialog/SendCommand.js98
-rw-r--r--legacy/web/app/view/dialog/SendCommandController.js78
-rw-r--r--legacy/web/app/view/dialog/Server.js159
-rw-r--r--legacy/web/app/view/dialog/User.js211
-rw-r--r--legacy/web/app/view/dialog/UserController.js69
-rw-r--r--legacy/web/app/view/edit/Attributes.js65
-rw-r--r--legacy/web/app/view/edit/AttributesController.js124
-rw-r--r--legacy/web/app/view/edit/Calendars.js50
-rw-r--r--legacy/web/app/view/edit/CalendarsController.js31
-rw-r--r--legacy/web/app/view/edit/ComputedAttributes.js80
-rw-r--r--legacy/web/app/view/edit/ComputedAttributesController.js31
-rw-r--r--legacy/web/app/view/edit/Devices.js161
-rw-r--r--legacy/web/app/view/edit/DevicesController.js139
-rw-r--r--legacy/web/app/view/edit/Drivers.js54
-rw-r--r--legacy/web/app/view/edit/DriversController.js31
-rw-r--r--legacy/web/app/view/edit/Geofences.js63
-rw-r--r--legacy/web/app/view/edit/GeofencesController.js30
-rw-r--r--legacy/web/app/view/edit/Groups.js109
-rw-r--r--legacy/web/app/view/edit/GroupsController.js141
-rw-r--r--legacy/web/app/view/edit/Maintenances.js77
-rw-r--r--legacy/web/app/view/edit/MaintenancesController.js31
-rw-r--r--legacy/web/app/view/edit/Notifications.js111
-rw-r--r--legacy/web/app/view/edit/NotificationsController.js31
-rw-r--r--legacy/web/app/view/edit/SavedCommands.js65
-rw-r--r--legacy/web/app/view/edit/SavedCommandsController.js31
-rw-r--r--legacy/web/app/view/edit/Toolbar.js49
-rw-r--r--legacy/web/app/view/edit/ToolbarController.js70
-rw-r--r--legacy/web/app/view/edit/Users.js156
-rw-r--r--legacy/web/app/view/edit/UsersController.js244
-rw-r--r--legacy/web/app/view/map/BaseMap.js243
-rw-r--r--legacy/web/app/view/map/GeofenceMap.js150
-rw-r--r--legacy/web/app/view/map/GeofenceMapController.js85
-rw-r--r--legacy/web/app/view/map/Map.js158
-rw-r--r--legacy/web/app/view/map/MapController.js101
-rw-r--r--legacy/web/app/view/map/MapMarkerController.js687
-rw-r--r--legacy/web/app/view/permissions/Base.js37
-rw-r--r--legacy/web/app/view/permissions/BaseController.js84
-rw-r--r--legacy/web/app/view/permissions/Calendars.js32
-rw-r--r--legacy/web/app/view/permissions/ComputedAttributes.js45
-rw-r--r--legacy/web/app/view/permissions/Devices.js82
-rw-r--r--legacy/web/app/view/permissions/Drivers.js38
-rw-r--r--legacy/web/app/view/permissions/Geofences.js43
-rw-r--r--legacy/web/app/view/permissions/Groups.js47
-rw-r--r--legacy/web/app/view/permissions/Maintenances.js65
-rw-r--r--legacy/web/app/view/permissions/Notifications.js78
-rw-r--r--legacy/web/app/view/permissions/SavedCommands.js50
-rw-r--r--legacy/web/app/view/permissions/Users.js32
-rw-r--r--legacy/web/apple-touch-icon.pngbin0 -> 4003 bytes
-rw-r--r--legacy/web/beep.wavbin0 -> 3047 bytes
-rw-r--r--legacy/web/debug.html16
-rw-r--r--legacy/web/favicon.icobin0 -> 15086 bytes
-rw-r--r--legacy/web/icon.pngbin0 -> 7941 bytes
-rw-r--r--legacy/web/images/animal.svg7
-rw-r--r--legacy/web/images/arrow.svg4
-rw-r--r--legacy/web/images/bicycle.svg7
-rw-r--r--legacy/web/images/boat.svg7
-rw-r--r--legacy/web/images/bus.svg7
-rw-r--r--legacy/web/images/car.svg7
-rw-r--r--legacy/web/images/crane.svg7
-rw-r--r--legacy/web/images/default.svg7
-rw-r--r--legacy/web/images/helicopter.svg7
-rw-r--r--legacy/web/images/motorcycle.svg7
-rw-r--r--legacy/web/images/offroad.svg7
-rw-r--r--legacy/web/images/person.svg7
-rw-r--r--legacy/web/images/pickup.svg7
-rw-r--r--legacy/web/images/plane.svg7
-rw-r--r--legacy/web/images/scooter.svg7
-rw-r--r--legacy/web/images/ship.svg7
-rw-r--r--legacy/web/images/tractor.svg7
-rw-r--r--legacy/web/images/train.svg7
-rw-r--r--legacy/web/images/tram.svg7
-rw-r--r--legacy/web/images/trolleybus.svg7
-rw-r--r--legacy/web/images/truck.svg7
-rw-r--r--legacy/web/images/van.svg7
-rw-r--r--legacy/web/l10n/af.json600
-rw-r--r--legacy/web/l10n/ar.json600
-rw-r--r--legacy/web/l10n/az.json600
-rw-r--r--legacy/web/l10n/bg.json600
-rw-r--r--legacy/web/l10n/bn.json600
-rw-r--r--legacy/web/l10n/ca.json600
-rw-r--r--legacy/web/l10n/cs.json600
-rw-r--r--legacy/web/l10n/da.json600
-rw-r--r--legacy/web/l10n/de.json600
-rw-r--r--legacy/web/l10n/el.json600
-rw-r--r--legacy/web/l10n/en.json569
-rw-r--r--legacy/web/l10n/es.json600
-rw-r--r--legacy/web/l10n/fa.json600
-rw-r--r--legacy/web/l10n/fi.json600
-rw-r--r--legacy/web/l10n/fr.json600
-rw-r--r--legacy/web/l10n/gl.json600
-rw-r--r--legacy/web/l10n/he.json600
-rw-r--r--legacy/web/l10n/hi.json600
-rw-r--r--legacy/web/l10n/hr.json600
-rw-r--r--legacy/web/l10n/hu.json600
-rw-r--r--legacy/web/l10n/id.json600
-rw-r--r--legacy/web/l10n/it.json600
-rw-r--r--legacy/web/l10n/ja.json600
-rw-r--r--legacy/web/l10n/ka.json600
-rw-r--r--legacy/web/l10n/kk.json600
-rw-r--r--legacy/web/l10n/km.json600
-rw-r--r--legacy/web/l10n/ko.json600
-rw-r--r--legacy/web/l10n/lo.json600
-rw-r--r--legacy/web/l10n/lt.json600
-rw-r--r--legacy/web/l10n/lv.json600
-rw-r--r--legacy/web/l10n/mk.json600
-rw-r--r--legacy/web/l10n/ml.json600
-rw-r--r--legacy/web/l10n/mn.json600
-rw-r--r--legacy/web/l10n/ms.json600
-rw-r--r--legacy/web/l10n/nb.json600
-rw-r--r--legacy/web/l10n/ne.json600
-rw-r--r--legacy/web/l10n/nl.json600
-rw-r--r--legacy/web/l10n/nn.json600
-rw-r--r--legacy/web/l10n/pl.json600
-rw-r--r--legacy/web/l10n/pt.json600
-rw-r--r--legacy/web/l10n/pt_BR.json600
-rw-r--r--legacy/web/l10n/ro.json600
-rw-r--r--legacy/web/l10n/ru.json600
-rw-r--r--legacy/web/l10n/si.json600
-rw-r--r--legacy/web/l10n/sk.json600
-rw-r--r--legacy/web/l10n/sl.json600
-rw-r--r--legacy/web/l10n/sq.json600
-rw-r--r--legacy/web/l10n/sr.json600
-rw-r--r--legacy/web/l10n/sv.json600
-rw-r--r--legacy/web/l10n/ta.json600
-rw-r--r--legacy/web/l10n/th.json600
-rw-r--r--legacy/web/l10n/tr.json600
-rw-r--r--legacy/web/l10n/uk.json600
-rw-r--r--legacy/web/l10n/uz.json600
-rw-r--r--legacy/web/l10n/vi.json600
-rw-r--r--legacy/web/l10n/zh.json600
-rw-r--r--legacy/web/l10n/zh_TW.json600
-rw-r--r--legacy/web/load.js183
-rw-r--r--legacy/web/logo.svg24
-rw-r--r--legacy/web/release.html16
-rw-r--r--legacy/web/simple/index.html238
291 files changed, 53962 insertions, 0 deletions
diff --git a/legacy/.eslintignore b/legacy/.eslintignore
new file mode 100644
index 00000000..934888f4
--- /dev/null
+++ b/legacy/.eslintignore
@@ -0,0 +1,4 @@
+web/simple/app.js
+web/app.min.js
+web/load.js
+web/lib
diff --git a/legacy/.eslintrc.json b/legacy/.eslintrc.json
new file mode 100644
index 00000000..e004ba3e
--- /dev/null
+++ b/legacy/.eslintrc.json
@@ -0,0 +1,61 @@
+{
+ "extends": "eslint:all",
+ "env": {
+ "browser": true
+ },
+ "globals": {
+ "Ext": false,
+ "ol": false,
+ "Traccar": false,
+ "Strings": false,
+ "Locale": false,
+ "proj4": false
+ },
+ "rules": {
+ "strict": "off",
+ "max-lines": ["error", 1000],
+ "max-len": ["error", 180],
+ "max-statements": ["error", 35],
+ "max-params": ["error", 5],
+ "indent": ["error", 4, {
+ "SwitchCase": 1
+ }],
+ "quotes": ["error", "single"],
+ "padded-blocks": ["error", "never"],
+ "dot-location": ["error", "property"],
+ "wrap-iife": ["error", "inside"],
+ "dot-notation": "off",
+ "array-bracket-newline": "off",
+ "array-element-newline": "off",
+ "sort-keys": "off",
+ "sort-vars": "off",
+ "no-magic-numbers": "off",
+ "no-mixed-operators": "off",
+ "prefer-template": "off",
+ "newline-per-chained-call": "off",
+ "object-shorthand": "off",
+ "func-names": "off",
+ "init-declarations": "off",
+ "no-var": "off",
+ "id-length": "off",
+ "no-undefined": "off",
+ "object-curly-newline": "off",
+ "prefer-destructuring": "off",
+ "no-plusplus": "off",
+ "no-param-reassign": "off",
+ "no-ternary": "off",
+ "multiline-ternary": "off",
+ "one-var-declaration-per-line": "off",
+ "no-shadow": "off",
+ "no-else-return": "off",
+ "consistent-this": "off",
+ "quote-props": "off",
+ "no-negated-condition": "off",
+ "prefer-arrow-callback": "off",
+ "no-prototype-builtins": "off",
+ "no-multi-assign": "off",
+ "no-bitwise": "off",
+ "prefer-rest-params": "off",
+ "function-paren-newline": "off"
+ }
+} \ No newline at end of file
diff --git a/legacy/LICENSE.txt b/legacy/LICENSE.txt
new file mode 100644
index 00000000..94a9ed02
--- /dev/null
+++ b/legacy/LICENSE.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/legacy/package-lock.json b/legacy/package-lock.json
new file mode 100644
index 00000000..d76105dd
--- /dev/null
+++ b/legacy/package-lock.json
@@ -0,0 +1,3017 @@
+{
+ "name": "traccar-web",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "traccar-web",
+ "hasInstallScript": true,
+ "dependencies": {
+ "extjs-gpl": "^6.2.0",
+ "ol": "^6.12.0",
+ "ol-layerswitcher": "^3.8.3",
+ "openlayers-dist": "^6.12.0",
+ "proj4": "^2.7.5"
+ },
+ "devDependencies": {
+ "eslint": "^4.4.1"
+ }
+ },
+ "node_modules/@mapbox/jsonlint-lines-primitives": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz",
+ "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/@mapbox/mapbox-gl-style-spec": {
+ "version": "13.23.1",
+ "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.23.1.tgz",
+ "integrity": "sha512-C6wh8A/5EdsgzhL6y6yl464VCQNIxK0yjrpnvCvchcFe3sNK2RbBw/J9u3m+p8Y6S6MsGuSMt3AkGAXOKMYweQ==",
+ "dependencies": {
+ "@mapbox/jsonlint-lines-primitives": "~2.0.2",
+ "@mapbox/point-geometry": "^0.1.0",
+ "@mapbox/unitbezier": "^0.0.0",
+ "csscolorparser": "~1.0.2",
+ "json-stringify-pretty-compact": "^2.0.0",
+ "minimist": "^1.2.5",
+ "rw": "^1.3.3",
+ "sort-object": "^0.3.2"
+ },
+ "bin": {
+ "gl-style-composite": "bin/gl-style-composite",
+ "gl-style-format": "bin/gl-style-format",
+ "gl-style-migrate": "bin/gl-style-migrate",
+ "gl-style-validate": "bin/gl-style-validate"
+ }
+ },
+ "node_modules/@mapbox/point-geometry": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz",
+ "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI="
+ },
+ "node_modules/@mapbox/unitbezier": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz",
+ "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4="
+ },
+ "node_modules/@petamoriken/float16": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.6.2.tgz",
+ "integrity": "sha512-zZnksXtFBqvONcXWuAtSWrl3YXaDbU2ArRCCuzM42mP0GBJclD6e0GC3zEemmrjiMSOHcLPyRC4vOnAsnomJIw=="
+ },
+ "node_modules/acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^3.0.4"
+ }
+ },
+ "node_modules/acorn-jsx/node_modules/acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "dependencies": {
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^5.0.0"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "node_modules/circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "deprecated": "CircularJSON is in maintenance only, flatted is its successor.",
+ "dev": true
+ },
+ "node_modules/cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
+ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
+ "dev": true
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true,
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "node_modules/csscolorparser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz",
+ "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs="
+ },
+ "node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^5.3.0",
+ "babel-code-frame": "^6.22.0",
+ "chalk": "^2.1.0",
+ "concat-stream": "^1.6.0",
+ "cross-spawn": "^5.1.0",
+ "debug": "^3.1.0",
+ "doctrine": "^2.1.0",
+ "eslint-scope": "^3.7.1",
+ "eslint-visitor-keys": "^1.0.0",
+ "espree": "^3.5.4",
+ "esquery": "^1.0.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "glob": "^7.1.2",
+ "globals": "^11.0.1",
+ "ignore": "^3.3.3",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^3.0.6",
+ "is-resolvable": "^1.0.0",
+ "js-yaml": "^3.9.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.3.0",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.2",
+ "mkdirp": "^0.5.1",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.8.2",
+ "path-is-inside": "^1.0.2",
+ "pluralize": "^7.0.0",
+ "progress": "^2.0.0",
+ "regexpp": "^1.0.1",
+ "require-uncached": "^1.0.3",
+ "semver": "^5.3.0",
+ "strip-ansi": "^4.0.0",
+ "strip-json-comments": "~2.0.1",
+ "table": "4.0.2",
+ "text-table": "~0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "3.7.3",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
+ "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esm": {
+ "version": "3.2.25",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^5.5.0",
+ "acorn-jsx": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "dev": true,
+ "dependencies": {
+ "chardet": "^0.4.0",
+ "iconv-lite": "^0.4.17",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/extjs-gpl": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/extjs-gpl/-/extjs-gpl-6.2.0.tgz",
+ "integrity": "sha512-A/l4PKXE89dojDoWkNKqr+2jryF9jX3KuuaXb3NWEKYAKipNyP4CZyVGj7HBJIZF9h/ioxaBm3YJdCklo+XDpQ=="
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "dev": true
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "node_modules/figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^1.2.1",
+ "object-assign": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
+ "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==",
+ "dev": true,
+ "dependencies": {
+ "circular-json": "^0.3.1",
+ "graceful-fs": "^4.1.2",
+ "rimraf": "~2.6.2",
+ "write": "^0.2.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "node_modules/geotiff": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-1.0.9.tgz",
+ "integrity": "sha512-PY+q1OP8RtQZkx1630pVfC3hEkxFnGW9LwIF/glSzcalyShkrH+W8uM/M4RVY12j4QkDQvRXVKOpU65hq6t0iQ==",
+ "dependencies": {
+ "@petamoriken/float16": "^3.4.7",
+ "lerc": "^3.0.0",
+ "lru-cache": "^6.0.0",
+ "pako": "^2.0.4",
+ "parse-headers": "^2.0.2",
+ "threads": "^1.7.0",
+ "xml-utils": "^1.0.2"
+ },
+ "engines": {
+ "browsers": "defaults",
+ "node": ">=10.19"
+ }
+ },
+ "node_modules/geotiff/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/geotiff/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.9",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+ "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+ "dev": true
+ },
+ "node_modules/has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-ansi/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+ "dev": true
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.0",
+ "cli-cursor": "^2.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^2.0.4",
+ "figures": "^2.0.0",
+ "lodash": "^4.3.0",
+ "mute-stream": "0.0.7",
+ "run-async": "^2.2.0",
+ "rx-lite": "^4.0.8",
+ "rx-lite-aggregates": "^4.0.8",
+ "string-width": "^2.1.0",
+ "strip-ansi": "^4.0.0",
+ "through": "^2.3.6"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-observable": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz",
+ "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/json-stringify-pretty-compact": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz",
+ "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ=="
+ },
+ "node_modules/lerc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz",
+ "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww=="
+ },
+ "node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/mapbox-to-css-font": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz",
+ "integrity": "sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow=="
+ },
+ "node_modules/mgrs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz",
+ "integrity": "sha1-+5FYjnjJACVnI5XLQLJffNatGCk="
+ },
+ "node_modules/mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/observable-fns": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz",
+ "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg=="
+ },
+ "node_modules/ol": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/ol/-/ol-6.12.0.tgz",
+ "integrity": "sha512-HR87aV//64aiGWbgzfsyRF5zFG+1nM1keRE4SugY0vmYyG/jjoij8qh3uaFHkFNQThdAy99sgLiQwTFk6AvGgw==",
+ "dependencies": {
+ "geotiff": "^1.0.8",
+ "ol-mapbox-style": "^6.8.2",
+ "pbf": "3.2.1",
+ "rbush": "^3.0.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/openlayers"
+ }
+ },
+ "node_modules/ol-layerswitcher": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/ol-layerswitcher/-/ol-layerswitcher-3.8.3.tgz",
+ "integrity": "sha512-UwUhalf/sGXjz3rvr0EjwsaUVlJAhyJCfcIPciKk1QdNbMKq/2ZXNKGafOjwP2eDxiqhkvnhpIrDGD8+gQ19Cg==",
+ "peerDependencies": {
+ "ol": ">=5.0.0"
+ }
+ },
+ "node_modules/ol-mapbox-style": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-6.9.0.tgz",
+ "integrity": "sha512-Isxk+IPB6pCBD2Pubz9cpQcZjEeuPhxyk/QsLZjb2+KwvyGaIFltdlxnxx/QXJ7rOxUiLvS/XhsOyiK0c7prEw==",
+ "dependencies": {
+ "@mapbox/mapbox-gl-style-spec": "^13.20.1",
+ "mapbox-to-css-font": "^2.4.1",
+ "webfont-matcher": "^1.1.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/openlayers-dist": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/openlayers-dist/-/openlayers-dist-6.12.0.tgz",
+ "integrity": "sha512-AN2k4cVk/btW05A0UjnMoR/JzgZK2p0iSjiDONCnjC60doicio6wjQ2eSgONOgt7wZgQeEiPFYpNfwdZZJtsJQ=="
+ },
+ "node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pako": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz",
+ "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg=="
+ },
+ "node_modules/parse-headers": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz",
+ "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw=="
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "node_modules/pbf": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
+ "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
+ "dependencies": {
+ "ieee754": "^1.1.12",
+ "resolve-protobuf-schema": "^2.1.0"
+ },
+ "bin": {
+ "pbf": "bin/pbf"
+ }
+ },
+ "node_modules/pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/proj4": {
+ "version": "2.7.5",
+ "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.7.5.tgz",
+ "integrity": "sha512-5ecXUXbHAfvdhfBQpU7EhUfPCQGUCPmVup/4gnZA3bJY3JcK/xxzm4QQDz1xiXokN6ux65VDczlCtBtKrTSpAQ==",
+ "dependencies": {
+ "mgrs": "1.0.0",
+ "wkt-parser": "^1.3.1"
+ }
+ },
+ "node_modules/protocol-buffers-schema": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
+ "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
+ },
+ "node_modules/pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "node_modules/quickselect": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+ "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+ },
+ "node_modules/rbush": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
+ "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==",
+ "dependencies": {
+ "quickselect": "^2.0.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "dependencies": {
+ "caller-path": "^0.1.0",
+ "resolve-from": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-protobuf-schema": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
+ "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
+ "dependencies": {
+ "protocol-buffers-schema": "^3.3.1"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/rw": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+ "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
+ },
+ "node_modules/rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+ "dev": true
+ },
+ "node_modules/rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "dev": true,
+ "dependencies": {
+ "rx-lite": "*"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/sort-asc": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.1.0.tgz",
+ "integrity": "sha1-q3md9h/HPqCVbHnEtTHtHp53J+k=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sort-desc": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz",
+ "integrity": "sha1-GYuMDN6wlcRjNBhh45JdTuNZqe4=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sort-object": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz",
+ "integrity": "sha1-mODRme3kDgfGGoRAPGHWw7KQ+eI=",
+ "dependencies": {
+ "sort-asc": "^0.1.0",
+ "sort-desc": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^5.2.3",
+ "ajv-keywords": "^2.1.0",
+ "chalk": "^2.1.0",
+ "lodash": "^4.17.4",
+ "slice-ansi": "1.0.0",
+ "string-width": "^2.1.1"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "node_modules/threads": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz",
+ "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==",
+ "dependencies": {
+ "callsites": "^3.1.0",
+ "debug": "^4.2.0",
+ "is-observable": "^2.1.0",
+ "observable-fns": "^0.6.1"
+ },
+ "funding": {
+ "url": "https://github.com/andywer/threads.js?sponsor=1"
+ },
+ "optionalDependencies": {
+ "tiny-worker": ">= 2"
+ }
+ },
+ "node_modules/threads/node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/threads/node_modules/debug": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/threads/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "node_modules/tiny-worker": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz",
+ "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==",
+ "optional": true,
+ "dependencies": {
+ "esm": "^3.2.25"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "node_modules/webfont-matcher": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/webfont-matcher/-/webfont-matcher-1.1.0.tgz",
+ "integrity": "sha1-mM6VCXsp4x++czBT4Q5XFkLRxsc="
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/wkt-parser": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.2.tgz",
+ "integrity": "sha512-A26BOOo7sHAagyxG7iuRhnKMO7Q3mEOiOT4oGUmohtN/Li5wameeU4S6f8vWw6NADTVKljBs8bzA8JPQgSEMVQ=="
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
+ "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "dependencies": {
+ "mkdirp": "^0.5.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/xml-utils": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.0.2.tgz",
+ "integrity": "sha512-rEn0FvKi+YGjv9omf22oAf+0d6Ly/sgJ/CUufU/nOzS7SRLmgwSujrewc03KojXxt+aPaTRpm593TgehtUBMSQ=="
+ },
+ "node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ }
+ },
+ "dependencies": {
+ "@mapbox/jsonlint-lines-primitives": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz",
+ "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ="
+ },
+ "@mapbox/mapbox-gl-style-spec": {
+ "version": "13.23.1",
+ "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.23.1.tgz",
+ "integrity": "sha512-C6wh8A/5EdsgzhL6y6yl464VCQNIxK0yjrpnvCvchcFe3sNK2RbBw/J9u3m+p8Y6S6MsGuSMt3AkGAXOKMYweQ==",
+ "requires": {
+ "@mapbox/jsonlint-lines-primitives": "~2.0.2",
+ "@mapbox/point-geometry": "^0.1.0",
+ "@mapbox/unitbezier": "^0.0.0",
+ "csscolorparser": "~1.0.2",
+ "json-stringify-pretty-compact": "^2.0.0",
+ "minimist": "^1.2.5",
+ "rw": "^1.3.3",
+ "sort-object": "^0.3.2"
+ }
+ },
+ "@mapbox/point-geometry": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz",
+ "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI="
+ },
+ "@mapbox/unitbezier": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz",
+ "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4="
+ },
+ "@petamoriken/float16": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.6.2.tgz",
+ "integrity": "sha512-zZnksXtFBqvONcXWuAtSWrl3YXaDbU2ArRCCuzM42mP0GBJclD6e0GC3zEemmrjiMSOHcLPyRC4vOnAsnomJIw=="
+ },
+ "acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "^3.0.4"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "^4.6.0",
+ "fast-deep-equal": "^1.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true,
+ "requires": {}
+ },
+ "ansi-escapes": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "^0.2.0"
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
+ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
+ "dev": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "csscolorparser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz",
+ "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs="
+ },
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.3.0",
+ "babel-code-frame": "^6.22.0",
+ "chalk": "^2.1.0",
+ "concat-stream": "^1.6.0",
+ "cross-spawn": "^5.1.0",
+ "debug": "^3.1.0",
+ "doctrine": "^2.1.0",
+ "eslint-scope": "^3.7.1",
+ "eslint-visitor-keys": "^1.0.0",
+ "espree": "^3.5.4",
+ "esquery": "^1.0.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "glob": "^7.1.2",
+ "globals": "^11.0.1",
+ "ignore": "^3.3.3",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^3.0.6",
+ "is-resolvable": "^1.0.0",
+ "js-yaml": "^3.9.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.3.0",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.2",
+ "mkdirp": "^0.5.1",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.8.2",
+ "path-is-inside": "^1.0.2",
+ "pluralize": "^7.0.0",
+ "progress": "^2.0.0",
+ "regexpp": "^1.0.1",
+ "require-uncached": "^1.0.3",
+ "semver": "^5.3.0",
+ "strip-ansi": "^4.0.0",
+ "strip-json-comments": "~2.0.1",
+ "table": "4.0.2",
+ "text-table": "~0.2.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.3",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
+ "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ },
+ "esm": {
+ "version": "3.2.25",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+ "optional": true
+ },
+ "espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.5.0",
+ "acorn-jsx": "^3.0.0"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.4.0",
+ "iconv-lite": "^0.4.17",
+ "tmp": "^0.0.33"
+ }
+ },
+ "extjs-gpl": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/extjs-gpl/-/extjs-gpl-6.2.0.tgz",
+ "integrity": "sha512-A/l4PKXE89dojDoWkNKqr+2jryF9jX3KuuaXb3NWEKYAKipNyP4CZyVGj7HBJIZF9h/ioxaBm3YJdCklo+XDpQ=="
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^1.2.1",
+ "object-assign": "^4.0.1"
+ }
+ },
+ "flat-cache": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
+ "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==",
+ "dev": true,
+ "requires": {
+ "circular-json": "^0.3.1",
+ "graceful-fs": "^4.1.2",
+ "rimraf": "~2.6.2",
+ "write": "^0.2.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "geotiff": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-1.0.9.tgz",
+ "integrity": "sha512-PY+q1OP8RtQZkx1630pVfC3hEkxFnGW9LwIF/glSzcalyShkrH+W8uM/M4RVY12j4QkDQvRXVKOpU65hq6t0iQ==",
+ "requires": {
+ "@petamoriken/float16": "^3.4.7",
+ "lerc": "^3.0.0",
+ "lru-cache": "^6.0.0",
+ "pako": "^2.0.4",
+ "parse-headers": "^2.0.2",
+ "threads": "^1.7.0",
+ "xml-utils": "^1.0.2"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+ },
+ "glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.2.9",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+ "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+ "dev": true
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "ignore": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.0",
+ "cli-cursor": "^2.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^2.0.4",
+ "figures": "^2.0.0",
+ "lodash": "^4.3.0",
+ "mute-stream": "0.0.7",
+ "run-async": "^2.2.0",
+ "rx-lite": "^4.0.8",
+ "rx-lite-aggregates": "^4.0.8",
+ "string-width": "^2.1.0",
+ "strip-ansi": "^4.0.0",
+ "through": "^2.3.6"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-observable": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz",
+ "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw=="
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json-stringify-pretty-compact": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz",
+ "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ=="
+ },
+ "lerc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz",
+ "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww=="
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "mapbox-to-css-font": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz",
+ "integrity": "sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow=="
+ },
+ "mgrs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz",
+ "integrity": "sha1-+5FYjnjJACVnI5XLQLJffNatGCk="
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "observable-fns": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz",
+ "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg=="
+ },
+ "ol": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/ol/-/ol-6.12.0.tgz",
+ "integrity": "sha512-HR87aV//64aiGWbgzfsyRF5zFG+1nM1keRE4SugY0vmYyG/jjoij8qh3uaFHkFNQThdAy99sgLiQwTFk6AvGgw==",
+ "requires": {
+ "geotiff": "^1.0.8",
+ "ol-mapbox-style": "^6.8.2",
+ "pbf": "3.2.1",
+ "rbush": "^3.0.1"
+ }
+ },
+ "ol-layerswitcher": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/ol-layerswitcher/-/ol-layerswitcher-3.8.3.tgz",
+ "integrity": "sha512-UwUhalf/sGXjz3rvr0EjwsaUVlJAhyJCfcIPciKk1QdNbMKq/2ZXNKGafOjwP2eDxiqhkvnhpIrDGD8+gQ19Cg==",
+ "requires": {}
+ },
+ "ol-mapbox-style": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-6.9.0.tgz",
+ "integrity": "sha512-Isxk+IPB6pCBD2Pubz9cpQcZjEeuPhxyk/QsLZjb2+KwvyGaIFltdlxnxx/QXJ7rOxUiLvS/XhsOyiK0c7prEw==",
+ "requires": {
+ "@mapbox/mapbox-gl-style-spec": "^13.20.1",
+ "mapbox-to-css-font": "^2.4.1",
+ "webfont-matcher": "^1.1.0"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "openlayers-dist": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/openlayers-dist/-/openlayers-dist-6.12.0.tgz",
+ "integrity": "sha512-AN2k4cVk/btW05A0UjnMoR/JzgZK2p0iSjiDONCnjC60doicio6wjQ2eSgONOgt7wZgQeEiPFYpNfwdZZJtsJQ=="
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "pako": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz",
+ "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg=="
+ },
+ "parse-headers": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz",
+ "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw=="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "pbf": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
+ "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
+ "requires": {
+ "ieee754": "^1.1.12",
+ "resolve-protobuf-schema": "^2.1.0"
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "proj4": {
+ "version": "2.7.5",
+ "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.7.5.tgz",
+ "integrity": "sha512-5ecXUXbHAfvdhfBQpU7EhUfPCQGUCPmVup/4gnZA3bJY3JcK/xxzm4QQDz1xiXokN6ux65VDczlCtBtKrTSpAQ==",
+ "requires": {
+ "mgrs": "1.0.0",
+ "wkt-parser": "^1.3.1"
+ }
+ },
+ "protocol-buffers-schema": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
+ "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "quickselect": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+ "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+ },
+ "rbush": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
+ "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==",
+ "requires": {
+ "quickselect": "^2.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "^0.1.0",
+ "resolve-from": "^1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "resolve-protobuf-schema": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
+ "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
+ "requires": {
+ "protocol-buffers-schema": "^3.3.1"
+ }
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true
+ },
+ "rw": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+ "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+ "dev": true
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "dev": true,
+ "requires": {
+ "rx-lite": "*"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0"
+ }
+ },
+ "sort-asc": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.1.0.tgz",
+ "integrity": "sha1-q3md9h/HPqCVbHnEtTHtHp53J+k="
+ },
+ "sort-desc": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz",
+ "integrity": "sha1-GYuMDN6wlcRjNBhh45JdTuNZqe4="
+ },
+ "sort-object": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz",
+ "integrity": "sha1-mODRme3kDgfGGoRAPGHWw7KQ+eI=",
+ "requires": {
+ "sort-asc": "^0.1.0",
+ "sort-desc": "^0.1.1"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.2.3",
+ "ajv-keywords": "^2.1.0",
+ "chalk": "^2.1.0",
+ "lodash": "^4.17.4",
+ "slice-ansi": "1.0.0",
+ "string-width": "^2.1.1"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "threads": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz",
+ "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==",
+ "requires": {
+ "callsites": "^3.1.0",
+ "debug": "^4.2.0",
+ "is-observable": "^2.1.0",
+ "observable-fns": "^0.6.1",
+ "tiny-worker": ">= 2"
+ },
+ "dependencies": {
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+ },
+ "debug": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ }
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "tiny-worker": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz",
+ "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==",
+ "optional": true,
+ "requires": {
+ "esm": "^3.2.25"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "webfont-matcher": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/webfont-matcher/-/webfont-matcher-1.1.0.tgz",
+ "integrity": "sha1-mM6VCXsp4x++czBT4Q5XFkLRxsc="
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "wkt-parser": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.2.tgz",
+ "integrity": "sha512-A26BOOo7sHAagyxG7iuRhnKMO7Q3mEOiOT4oGUmohtN/Li5wameeU4S6f8vWw6NADTVKljBs8bzA8JPQgSEMVQ=="
+ },
+ "word-wrap": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
+ "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "^0.5.1"
+ }
+ },
+ "xml-utils": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.0.2.tgz",
+ "integrity": "sha512-rEn0FvKi+YGjv9omf22oAf+0d6Ly/sgJ/CUufU/nOzS7SRLmgwSujrewc03KojXxt+aPaTRpm593TgehtUBMSQ=="
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ }
+ }
+}
diff --git a/legacy/package.json b/legacy/package.json
new file mode 100644
index 00000000..d8c43c6b
--- /dev/null
+++ b/legacy/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "traccar-web",
+ "dependencies": {
+ "extjs-gpl": "^6.2.0",
+ "ol": "^6.12.0",
+ "ol-layerswitcher": "^3.8.3",
+ "openlayers-dist": "^6.12.0",
+ "proj4": "^2.7.5"
+ },
+ "devDependencies": {
+ "eslint": "^4.4.1"
+ },
+ "scripts": {
+ "postinstall": "/bin/bash -c 'mkdir -p web/lib/{ol,ol-layerswitcher,proj4,extjs} && cp node_modules/openlayers-dist/{ol.js,ol.css} web/lib/ol/ && cp node_modules/ol-layerswitcher/dist/{ol-layerswitcher.js,ol-layerswitcher.css} web/lib/ol-layerswitcher/ && cp node_modules/proj4/dist/proj4.js web/lib/proj4/ && cp node_modules/extjs-gpl/build/ext-all.js web/lib/extjs/ && mkdir -p web/lib/extjs/classic && cp -r node_modules/extjs-gpl/build/classic/locale web/lib/extjs/classic/locale && cp -r node_modules/extjs-gpl/build/classic/theme-triton web/lib/extjs/classic/theme-triton && mkdir -p web/lib/extjs/packages/charts && cp -r node_modules/extjs-gpl/build/packages/charts/classic web/lib/extjs/packages/charts/classic'",
+ "build": "sencha compile --classpath=web/app.js,web/app,node_modules/extjs-gpl/packages/core/src,node_modules/extjs-gpl/packages/core/overrides,node_modules/extjs-gpl/classic/classic/src,node_modules/extjs-gpl/classic/classic/overrides exclude -all and include -recursive -file web/app.js and exclude -namespace=Ext and concatenate -closure web/app.min.js",
+ "lint": "./node_modules/.bin/eslint web/."
+ }
+}
diff --git a/legacy/web/app.css b/legacy/web/app.css
new file mode 100644
index 00000000..f9f28bb9
--- /dev/null
+++ b/legacy/web/app.css
@@ -0,0 +1,62 @@
+.view-color-green {
+ background-color: rgba(77, 250, 144, 0.3);
+}
+.view-color-yellow {
+ background-color: rgba(250, 190, 77, 0.3);
+}
+.view-color-red {
+ background-color: rgba(255, 84, 104, 0.3);
+}
+
+.view-item-disabled {
+ opacity: 0.5;
+}
+
+.toolbar-header-style {
+ background-color: #5fa2dd !important;
+}
+
+body.x-border-layout-ct, div.x-border-layout-ct {
+ background-color: #bbbbbb !important;
+}
+
+.x-fieldset {
+ overflow: visible !important; /* workaround for Safari issue */
+}
+
+#update {
+ position: absolute;
+ width: 100%;
+ top: 20px;
+ font-weight: bold;
+ text-align: center;
+}
+
+#attribution {
+ position: absolute;
+ bottom: 10px;
+ right: 15px;
+ font-size: x-small;
+}
+
+#spinner:before {
+ content: '';
+ box-sizing: border-box;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 60px;
+ height: 60px;
+ margin-top: -30px;
+ margin-left: -30px;
+ border-radius: 50%;
+ border-top: 6px solid #5fa2dd;
+ border-right: 6px solid transparent;
+ animation: spinner .6s linear infinite;
+}
+
+@keyframes spinner {
+ to {
+ transform: rotate(360deg);
+ }
+}
diff --git a/legacy/web/app.js b/legacy/web/app.js
new file mode 100644
index 00000000..cc95b0a9
--- /dev/null
+++ b/legacy/web/app.js
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.application({
+ name: 'Traccar',
+ extend: 'Traccar.Application'
+});
diff --git a/legacy/web/app/Application.js b/legacy/web/app/Application.js
new file mode 100644
index 00000000..dd9210dc
--- /dev/null
+++ b/legacy/web/app/Application.js
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.Application', {
+ extend: 'Ext.app.Application',
+ name: 'Traccar',
+
+ requires: [
+ 'Traccar.Style',
+ 'Traccar.AttributeFormatter',
+ 'Traccar.view.TouchFix62'
+ ],
+
+ models: [
+ 'Server',
+ 'User',
+ 'Group',
+ 'Device',
+ 'Position',
+ 'Attribute',
+ 'Command',
+ 'Event',
+ 'Geofence',
+ 'Notification',
+ 'ReportSummary',
+ 'ReportTrip',
+ 'ReportStop',
+ 'Calendar',
+ 'KnownAttribute',
+ 'Driver',
+ 'KnownCommand',
+ 'KnownNotification',
+ 'Maintenance'
+ ],
+
+ stores: [
+ 'Groups',
+ 'Devices',
+ 'AllGroups',
+ 'AllDevices',
+ 'AlarmTypes',
+ 'Positions',
+ 'LatestPositions',
+ 'EventPositions',
+ 'Users',
+ 'Attributes',
+ 'MapTypes',
+ 'DistanceUnits',
+ 'SpeedUnits',
+ 'CoordinateFormats',
+ 'CommandTypes',
+ 'TimeUnits',
+ 'Languages',
+ 'Events',
+ 'Geofences',
+ 'AllGeofences',
+ 'Notifications',
+ 'AllNotifications',
+ 'GeofenceTypes',
+ 'ReportRoute',
+ 'ReportEvents',
+ 'ReportTrips',
+ 'ReportStops',
+ 'ReportSummary',
+ 'ReportTypes',
+ 'ReportEventTypes',
+ 'ReportChartTypes',
+ 'ReportPeriods',
+ 'Statistics',
+ 'DeviceImages',
+ 'Calendars',
+ 'AllCalendars',
+ 'AllTimezones',
+ 'VisibleDevices',
+ 'DeviceStatuses',
+ 'CommonDeviceAttributes',
+ 'DeviceAttributes',
+ 'GeofenceAttributes',
+ 'GroupAttributes',
+ 'ServerAttributes',
+ 'CommonUserAttributes',
+ 'UserAttributes',
+ 'ComputedAttributes',
+ 'AllComputedAttributes',
+ 'PositionAttributes',
+ 'AttributeValueTypes',
+ 'Drivers',
+ 'AllDrivers',
+ 'KnownCommands',
+ 'VolumeUnits',
+ 'AllCommandTypes',
+ 'Commands',
+ 'AllCommands',
+ 'DeviceCommands',
+ 'AllNotificationTypes',
+ 'Maintenances',
+ 'AllMaintenances',
+ 'MaintenanceTypes',
+ 'HoursUnits',
+ 'AllNotificators'
+ ],
+
+ controllers: [
+ 'Root'
+ ],
+
+ isMobile: function () {
+ return window.matchMedia && window.matchMedia('(max-width: 768px)').matches;
+ },
+
+ getVehicleFeaturesDisabled: function () {
+ return this.getBooleanAttributePreference('ui.disableVehicleFeatures');
+ },
+
+ getEventString: function (eventType) {
+ var key = 'event' + eventType.charAt(0).toUpperCase() + eventType.slice(1);
+ return Strings[key] || key;
+ },
+
+ getNotificatorString: function (eventType) {
+ var key = 'notificator' + eventType.charAt(0).toUpperCase() + eventType.slice(1);
+ return Strings[key] || key;
+ },
+
+ showReports: function (show) {
+ var rootPanel = Ext.getCmp('rootPanel');
+ if (rootPanel) {
+ rootPanel.setActiveItem(show ? 1 : 0);
+ }
+ },
+
+ showEvents: function (show) {
+ var rootPanel = Ext.getCmp('rootPanel');
+ if (rootPanel) {
+ rootPanel.setActiveItem(show ? 2 : 0);
+ }
+ },
+
+ updateNotificationToken: function (token) {
+ var attributes = Ext.clone(this.user.get('attributes'));
+ if (!attributes.notificationTokens || attributes.notificationTokens.indexOf(token) < 0) {
+ if (!attributes.notificationTokens) {
+ attributes.notificationTokens = token;
+ } else {
+ attributes.notificationTokens += ',' + token;
+ }
+ this.user.set('attributes', attributes);
+ this.user.save();
+ }
+ },
+
+ setUser: function (data) {
+ var reader = Ext.create('Ext.data.reader.Json', {
+ model: 'Traccar.model.User'
+ });
+ this.user = reader.readRecords(data).getRecords()[0];
+ },
+
+ getUser: function () {
+ return this.user;
+ },
+
+ setServer: function (data) {
+ var reader = Ext.create('Ext.data.reader.Json', {
+ model: 'Traccar.model.Server'
+ });
+ this.server = reader.readRecords(data).getRecords()[0];
+ },
+
+ getServer: function () {
+ return this.server;
+ },
+
+ getPreference: function (key, defaultValue) {
+ if (this.getServer().get('forceSettings')) {
+ return this.getServer().get(key) || this.getUser().get(key) || defaultValue;
+ } else {
+ return this.getUser().get(key) || this.getServer().get(key) || defaultValue;
+ }
+ },
+
+ getAttributePreference: function (key, defaultValue) {
+ if (this.getServer().get('forceSettings')) {
+ return this.getServer().get('attributes')[key] || this.getUser().get('attributes')[key] || defaultValue;
+ } else {
+ return this.getUser().get('attributes')[key] || this.getServer().get('attributes')[key] || defaultValue;
+ }
+ },
+
+ getBooleanAttributePreference: function (key) {
+ return this.getAttributePreference(key, false).toString() === 'true';
+ },
+
+ getReportColor: function (deviceId) {
+ var index, reportColor, device = Ext.getStore('Devices').getById(deviceId);
+ if (device) {
+ reportColor = device.get('attributes')['web.reportColor'];
+ }
+ if (reportColor) {
+ return reportColor;
+ } else {
+ index = 0;
+ if (deviceId !== undefined) {
+ index = deviceId % Traccar.Style.mapRouteColor.length;
+ }
+ return Traccar.Style.mapRouteColor[index];
+ }
+ },
+
+ showError: function (error) {
+ if (Ext.isString(error)) {
+ Ext.Msg.alert(Strings.errorTitle, error);
+ } else if (error.responseText) {
+ Ext.Msg.alert(Strings.errorTitle, Strings.errorGeneral +
+ '<br><br><textarea readonly rows="5" style="resize: none; width: 100%;">' +
+ error.responseText + '</textarea>');
+ } else if (error.statusText) {
+ Ext.Msg.alert(Strings.errorTitle, error.statusText);
+ } else {
+ Ext.Msg.alert(Strings.errorTitle, Strings.errorConnection);
+ }
+ },
+
+ showToast: function (message, title) {
+ Ext.toast({
+ html: message,
+ title: title,
+ width: Traccar.Style.toastWidth,
+ align: 'br'
+ });
+ }
+});
diff --git a/legacy/web/app/AttributeFormatter.js b/legacy/web/app/AttributeFormatter.js
new file mode 100644
index 00000000..d207ef1e
--- /dev/null
+++ b/legacy/web/app/AttributeFormatter.js
@@ -0,0 +1,311 @@
+/*
+ * Copyright 2015 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.AttributeFormatter', {
+ singleton: true,
+
+ numberFormatterFactory: function (precision, suffix) {
+ return function (value) {
+ if (value !== undefined) {
+ return Number(value.toFixed(precision)) + ' ' + suffix;
+ }
+ return null;
+ };
+ },
+
+ coordinateFormatter: function (key, value) {
+ return Ext.getStore('CoordinateFormats').formatValue(key, value, Traccar.app.getPreference('coordinateFormat'));
+ },
+
+ speedFormatter: function (value) {
+ return Ext.getStore('SpeedUnits').formatValue(value, Traccar.app.getAttributePreference('speedUnit'));
+ },
+
+ speedConverter: function (value) {
+ return Ext.getStore('SpeedUnits').convertValue(value, Traccar.app.getAttributePreference('speedUnit'));
+ },
+
+ courseFormatter: function (value) {
+ var courseValues = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'];
+ return courseValues[Math.floor(value / 45)];
+ },
+
+ distanceFormatter: function (value) {
+ return Ext.getStore('DistanceUnits').formatValue(value, Traccar.app.getAttributePreference('distanceUnit'));
+ },
+
+ distanceConverter: function (value) {
+ return Ext.getStore('DistanceUnits').convertValue(value, Traccar.app.getAttributePreference('distanceUnit'));
+ },
+
+ volumeFormatter: function (value) {
+ return Ext.getStore('VolumeUnits').formatValue(value, Traccar.app.getAttributePreference('volumeUnit'));
+ },
+
+ volumeConverter: function (value) {
+ return Ext.getStore('VolumeUnits').convertValue(value, Traccar.app.getAttributePreference('volumeUnit'));
+ },
+
+ hoursFormatter: function (value) {
+ return Ext.getStore('HoursUnits').formatValue(value, 'h');
+ },
+
+ hoursConverter: function (value) {
+ return Ext.getStore('HoursUnits').convertValue(value, 'h');
+ },
+
+ durationFormatter: function (value) {
+ return Ext.getStore('HoursUnits').formatValue(value, 'h', true);
+ },
+
+ deviceIdFormatter: function (value) {
+ var device, store;
+ if (value !== 0) {
+ store = Ext.getStore('AllDevices');
+ if (store.getTotalCount() === 0) {
+ store = Ext.getStore('Devices');
+ }
+ device = store.getById(value);
+ return device ? device.get('name') : '';
+ }
+ return null;
+ },
+
+ groupIdFormatter: function (value) {
+ var group, store;
+ if (value !== 0) {
+ store = Ext.getStore('AllGroups');
+ if (store.getTotalCount() === 0) {
+ store = Ext.getStore('Groups');
+ }
+ group = store.getById(value);
+ return group ? group.get('name') : value;
+ }
+ return null;
+ },
+
+ geofenceIdFormatter: function (value) {
+ var geofence, store;
+ if (value !== 0) {
+ store = Ext.getStore('AllGeofences');
+ if (store.getTotalCount() === 0) {
+ store = Ext.getStore('Geofences');
+ }
+ geofence = store.getById(value);
+ return geofence ? geofence.get('name') : '';
+ }
+ return null;
+ },
+
+ calendarIdFormatter: function (value) {
+ var calendar, store;
+ if (value !== 0) {
+ store = Ext.getStore('AllCalendars');
+ if (store.getTotalCount() === 0) {
+ store = Ext.getStore('Calendars');
+ }
+ calendar = store.getById(value);
+ return calendar ? calendar.get('name') : '';
+ }
+ return null;
+ },
+
+ driverUniqueIdFormatter: function (value) {
+ var driver, store;
+ if (value !== 0) {
+ store = Ext.getStore('AllDrivers');
+ if (store.getTotalCount() === 0) {
+ store = Ext.getStore('Drivers');
+ }
+ driver = store.findRecord('uniqueId', value, 0, false, true, true);
+ return driver ? value + ' (' + driver.get('name') + ')' : value;
+ }
+ return null;
+ },
+
+ maintenanceIdFormatter: function (value) {
+ var maintenance, store;
+ if (value !== 0) {
+ store = Ext.getStore('AllMaintenances');
+ if (store.getTotalCount() === 0) {
+ store = Ext.getStore('Maintenances');
+ }
+ maintenance = store.getById(value);
+ return maintenance ? maintenance.get('name') : '';
+ }
+ return null;
+ },
+
+ lastUpdateFormatter: function (value) {
+ var seconds, interval;
+ if (value) {
+ seconds = Math.floor((new Date() - value) / 1000);
+ if (seconds < 0) {
+ seconds = 0;
+ }
+ interval = Math.floor(seconds / 86400);
+ if (interval > 1) {
+ return interval + ' ' + Strings.sharedDays;
+ }
+ interval = Math.floor(seconds / 3600);
+ if (interval > 1) {
+ return interval + ' ' + Strings.sharedHours;
+ }
+ return Math.floor(seconds / 60) + ' ' + Strings.sharedMinutes;
+ }
+ return null;
+ },
+
+ commandTypeFormatter: function (value) {
+ var name = Strings['command' + value.charAt(0).toUpperCase() + value.slice(1)];
+ return name ? name : value;
+ },
+
+ defaultFormatter: function (value) {
+ if (typeof value === 'number') {
+ return Number(value.toFixed(Traccar.Style.numberPrecision));
+ } else if (typeof value === 'boolean') {
+ return value ? Ext.Msg.buttonText.yes : Ext.Msg.buttonText.no;
+ } else if (value instanceof Date) {
+ if (Traccar.app.getPreference('twelveHourFormat', false)) {
+ return Ext.Date.format(value, Traccar.Style.dateTimeFormat12);
+ } else {
+ return Ext.Date.format(value, Traccar.Style.dateTimeFormat24);
+ }
+ }
+ return value;
+ },
+
+ dateFormatter: function (value) {
+ return Ext.Date.format(value, Traccar.Style.dateFormat);
+ },
+
+ getFormatter: function (key) {
+ var self = this;
+
+ switch (key) {
+ case 'latitude':
+ case 'longitude':
+ return function (value) {
+ return self.coordinateFormatter(key, value);
+ };
+ case 'speed':
+ return this.speedFormatter;
+ case 'course':
+ return this.courseFormatter;
+ case 'distance':
+ case 'accuracy':
+ return this.distanceFormatter;
+ case 'duration':
+ return this.durationFormatter;
+ case 'deviceId':
+ return this.deviceIdFormatter;
+ case 'groupId':
+ return this.groupIdFormatter;
+ case 'geofenceId':
+ return this.geofenceIdFormatter;
+ case 'maintenanceId':
+ return this.maintenanceIdFormatter;
+ case 'calendarId':
+ return this.calendarIdFormatter;
+ case 'lastUpdate':
+ return this.lastUpdateFormatter;
+ case 'spentFuel':
+ return this.volumeFormatter;
+ case 'driverUniqueId':
+ return this.driverUniqueIdFormatter;
+ case 'commandType':
+ return this.commandTypeFormatter;
+ default:
+ return this.defaultFormatter;
+ }
+ },
+
+ getConverter: function (key) {
+ switch (key) {
+ case 'speed':
+ return this.speedConverter;
+ case 'distance':
+ case 'accuracy':
+ return this.distanceConverter;
+ case 'spentFuel':
+ return this.volumeConverter;
+ default:
+ return function (value) {
+ return value;
+ };
+ }
+ },
+
+ getAttributeFormatter: function (key) {
+ var dataType = Ext.getStore('PositionAttributes').getAttributeDataType(key);
+
+ switch (dataType) {
+ case 'distance':
+ return this.distanceFormatter;
+ case 'speed':
+ return this.speedFormatter;
+ case 'driverUniqueId':
+ return this.driverUniqueIdFormatter;
+ case 'voltage':
+ return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedVoltAbbreviation);
+ case 'percentage':
+ return this.numberFormatterFactory(Traccar.Style.numberPrecision, '&#37;');
+ case 'temperature':
+ return this.numberFormatterFactory(Traccar.Style.numberPrecision, '&deg;C');
+ case 'volume':
+ return this.volumeFormatter;
+ case 'hours':
+ return this.hoursFormatter;
+ case 'consumption':
+ return this.numberFormatterFactory(Traccar.Style.numberPrecision, Strings.sharedLiterPerHourAbbreviation);
+ default:
+ return this.defaultFormatter;
+ }
+ },
+
+ getAttributeConverter: function (key) {
+ var dataType = Ext.getStore('PositionAttributes').getAttributeDataType(key);
+
+ switch (dataType) {
+ case 'distance':
+ return this.distanceConverter;
+ case 'speed':
+ return this.speedConverter;
+ case 'volume':
+ return this.volumeConverter;
+ case 'hours':
+ return this.hoursConverter;
+ default:
+ return function (value) {
+ return value;
+ };
+ }
+ },
+
+ renderAttribute: function (value, attribute) {
+ if (attribute && attribute.get('dataType') === 'speed') {
+ return Ext.getStore('SpeedUnits').formatValue(value, Traccar.app.getAttributePreference('speedUnit', 'kn'), true);
+ } else if (attribute && attribute.get('dataType') === 'distance') {
+ return Ext.getStore('DistanceUnits').formatValue(value, Traccar.app.getAttributePreference('distanceUnit', 'km'), true);
+ } else if (attribute && attribute.get('dataType') === 'hours') {
+ return Ext.getStore('HoursUnits').formatValue(value, 'h', true);
+ } else {
+ return value;
+ }
+ }
+});
diff --git a/legacy/web/app/DeviceImages.js b/legacy/web/app/DeviceImages.js
new file mode 100644
index 00000000..af45ce90
--- /dev/null
+++ b/legacy/web/app/DeviceImages.js
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.DeviceImages', {
+ singleton: true,
+
+ getImageSvg: function (color, zoom, angle, category) {
+ var i, info, svg, width, height, rotateTransform, scaleTransform, fill;
+
+ info = Ext.getStore('DeviceImages').findRecord('key', category || 'default', 0, false, false, true);
+ svg = Ext.clone(info.get('svg'));
+ if (!svg) {
+ svg = this.cloneDocument(info.get('svg'));
+ }
+
+ width = parseFloat(svg.documentElement.getAttribute('width'));
+ height = parseFloat(svg.documentElement.getAttribute('height'));
+
+ fill = info.get('fillId');
+ if (!Ext.isArray(fill)) {
+ fill = [fill];
+ }
+ for (i = 0; i < fill.length; i++) {
+ svg.getElementById(fill[i]).style.fill = color;
+ }
+
+ rotateTransform = 'rotate(' + angle + ' ' + width / 2 + ' ' + height / 2 + ')';
+ svg.getElementById(info.get('rotateId')).setAttribute('transform', rotateTransform);
+
+ if (zoom) {
+ width *= Traccar.Style.mapScaleSelected;
+ height *= Traccar.Style.mapScaleSelected;
+ scaleTransform = 'scale(' + Traccar.Style.mapScaleSelected + ') ';
+ } else {
+ width *= Traccar.Style.mapScaleNormal;
+ height *= Traccar.Style.mapScaleNormal;
+ scaleTransform = 'scale(' + Traccar.Style.mapScaleNormal + ') ';
+ }
+
+ if (info.get('scaleId') !== info.get('rotateId')) {
+ svg.getElementById(info.get('scaleId')).setAttribute('transform', scaleTransform);
+ } else {
+ svg.getElementById(info.get('scaleId')).setAttribute('transform', scaleTransform + ' ' + rotateTransform);
+ }
+
+ svg.documentElement.setAttribute('width', width);
+ svg.documentElement.setAttribute('height', height);
+ svg.documentElement.setAttribute('viewBox', '0 0 ' + width + ' ' + height);
+
+ return svg;
+ },
+
+ formatSrc: function (svg) {
+ return 'data:image/svg+xml;charset=utf-8,' +
+ encodeURIComponent(new XMLSerializer().serializeToString(svg.documentElement));
+ },
+
+ cloneDocument: function (svgDocument) {
+ var newDocument, newNode;
+ newDocument = svgDocument.implementation.createDocument(svgDocument.namespaceURI, null, null);
+ newNode = newDocument.importNode(svgDocument.documentElement, true);
+ newDocument.appendChild(newNode);
+ return newDocument;
+ },
+
+ getImageIcon: function (color, zoom, angle, category) {
+ var image, svg, width, height;
+
+ svg = this.getImageSvg(color, zoom, angle, category);
+ width = parseFloat(svg.documentElement.getAttribute('width'));
+ height = parseFloat(svg.documentElement.getAttribute('height'));
+
+ image = new ol.style.Icon({
+ imgSize: [width, height],
+ src: this.formatSrc(svg)
+ });
+ image.fill = color;
+ image.zoom = zoom;
+ image.angle = angle;
+ image.category = category;
+
+ return image;
+ }
+});
diff --git a/legacy/web/app/GeofenceConverter.js b/legacy/web/app/GeofenceConverter.js
new file mode 100644
index 00000000..688f2233
--- /dev/null
+++ b/legacy/web/app/GeofenceConverter.js
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.GeofenceConverter', {
+ singleton: true,
+
+ wktToGeometry: function (mapView, wkt) {
+ var geometry, projection, resolutionAtEquator, pointResolution, resolutionFactor,
+ points = [], center, radius, content, i, lat, lon, coordinates;
+ if (wkt.lastIndexOf('POLYGON', 0) === 0) {
+ content = wkt.match(/\([^()]+\)/);
+ if (content !== null) {
+ coordinates = content[0].match(/-?\d+\.?\d*/g);
+ if (coordinates !== null) {
+ projection = mapView.getProjection();
+ for (i = 0; i < coordinates.length; i += 2) {
+ lat = Number(coordinates[i]);
+ lon = Number(coordinates[i + 1]);
+ points.push(ol.proj.transform([lon, lat], 'EPSG:4326', projection));
+ }
+ geometry = new ol.geom.Polygon([points]);
+ }
+ }
+ } else if (wkt.lastIndexOf('CIRCLE', 0) === 0) {
+ content = wkt.match(/\([^()]+\)/);
+ if (content !== null) {
+ coordinates = content[0].match(/-?\d+\.?\d*/g);
+ if (coordinates !== null) {
+ projection = mapView.getProjection();
+ center = ol.proj.transform([Number(coordinates[1]), Number(coordinates[0])], 'EPSG:4326', projection);
+ resolutionAtEquator = mapView.getResolution();
+ pointResolution = ol.proj.getPointResolution(projection, resolutionAtEquator, center);
+ resolutionFactor = resolutionAtEquator / pointResolution;
+ radius = Number(coordinates[2]) / ol.proj.Units.METERS_PER_UNIT.m * resolutionFactor;
+ geometry = new ol.geom.Circle(center, radius);
+ }
+ }
+ } else if (wkt.lastIndexOf('LINESTRING', 0) === 0) {
+ content = wkt.match(/\([^()]+\)/);
+ if (content !== null) {
+ coordinates = content[0].match(/-?\d+\.?\d*/g);
+ if (coordinates !== null) {
+ projection = mapView.getProjection();
+ for (i = 0; i < coordinates.length; i += 2) {
+ lat = Number(coordinates[i]);
+ lon = Number(coordinates[i + 1]);
+ points.push(ol.proj.transform([lon, lat], 'EPSG:4326', projection));
+ }
+ geometry = new ol.geom.LineString(points);
+ }
+ }
+ }
+ return geometry;
+ },
+
+ geometryToWkt: function (projection, geometry) {
+ var result, i, center, radius, edgeCoordinate, groundRadius, points;
+ if (geometry instanceof ol.geom.Circle) {
+ center = geometry.getCenter();
+ radius = geometry.getRadius();
+ edgeCoordinate = [center[0] + radius, center[1]];
+ center = ol.proj.transform(center, projection, 'EPSG:4326');
+ groundRadius = ol.sphere.getDistance(
+ center, ol.proj.transform(edgeCoordinate, projection, 'EPSG:4326'), 6378137);
+ result = 'CIRCLE (';
+ result += center[1] + ' ' + center[0] + ', ';
+ result += groundRadius.toFixed(1) + ')';
+ } else if (geometry instanceof ol.geom.Polygon) {
+ geometry.transform(projection, 'EPSG:4326');
+ points = geometry.getCoordinates();
+ result = 'POLYGON((';
+ for (i = 0; i < points[0].length; i += 1) {
+ result += points[0][i][1] + ' ' + points[0][i][0] + ', ';
+ }
+ result = result.substring(0, result.length - 2) + '))';
+ } else if (geometry instanceof ol.geom.LineString) {
+ geometry.transform(projection, 'EPSG:4326');
+ points = geometry.getCoordinates();
+ result = 'LINESTRING (';
+ for (i = 0; i < points.length; i += 1) {
+ result += points[i][1] + ' ' + points[i][0] + ', ';
+ }
+ result = result.substring(0, result.length - 2) + ')';
+ }
+ return result;
+ }
+});
diff --git a/legacy/web/app/Style.js b/legacy/web/app/Style.js
new file mode 100644
index 00000000..371e05a1
--- /dev/null
+++ b/legacy/web/app/Style.js
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.Style', {
+ singleton: true,
+
+ refreshPeriod: 60 * 1000,
+ reconnectTimeout: 60 * 1000,
+ reportTimeout: 120 * 1000,
+
+ normalPadding: 10,
+
+ windowWidth: 800,
+ windowHeight: 600,
+
+ formFieldWidth: 275,
+
+ dateTimeFormat24: 'Y-m-d H:i:s',
+ dateTimeFormat12: 'Y-m-d g:i:s a',
+ timeFormat24: 'H:i',
+ timeFormat12: 'g:i a',
+ dateFormat: 'Y-m-d',
+ weekStartDay: 1,
+
+ deviceWidth: 400,
+ toastWidth: 300,
+
+ reportHeight: 250,
+
+ columnWidthNormal: 100,
+
+ mapDefaultLat: 48.8567,
+ mapDefaultLon: 2.3508,
+ mapDefaultZoom: 4,
+
+ mapRouteColor: [
+ '#F06292',
+ '#BA68C8',
+ '#4DD0E1',
+ '#4DB6AC',
+ '#FF8A65',
+ '#A1887F'
+ ],
+ mapRouteWidth: 5,
+
+ mapTextColor: 'rgba(50, 50, 50, 1.0)',
+ mapTextStrokeColor: 'rgba(255, 255, 255, 1.0)',
+ mapTextStrokeWidth: 2,
+ mapTextOffset: 2,
+ mapTextFont: 'bold 12px sans-serif',
+
+ mapColorOnline: 'rgba(77, 250, 144, 1.0)',
+ mapColorUnknown: 'rgba(250, 190, 77, 1.0)',
+ mapColorOffline: 'rgba(255, 162, 173, 1.0)',
+
+ mapScaleNormal: 1,
+ mapScaleSelected: 1.5,
+
+ mapMaxZoom: 18,
+ mapDelay: 500,
+
+ mapAccuracyColor: 'rgba(96, 96, 96, 1.0)',
+
+ mapGeofenceTextColor: 'rgba(14, 88, 141, 1.0)',
+ mapGeofenceColor: 'rgba(21, 127, 204, 1.0)',
+ mapGeofenceOverlayOpacity: 0.2,
+ mapGeofenceWidth: 5,
+ mapGeofenceRadius: 9,
+
+ mapAnimateMarkerDuration: 2000,
+ mapAnimateMarkerTimeout: 40,
+
+ coordinatePrecision: 6,
+ numberPrecision: 2,
+
+ reportGridStyle: 'borderTop: 1px solid lightgray',
+
+ chartPadding: '20 40 10 10',
+ chartMarkerRadius: 3,
+ chartMarkerHighlightScaling: 1.5
+});
diff --git a/legacy/web/app/controller/Root.js b/legacy/web/app/controller/Root.js
new file mode 100644
index 00000000..22869f45
--- /dev/null
+++ b/legacy/web/app/controller/Root.js
@@ -0,0 +1,363 @@
+/*
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.controller.Root', {
+ extend: 'Ext.app.Controller',
+ alias: 'controller.root',
+
+ requires: [
+ 'Traccar.view.dialog.Login',
+ 'Traccar.view.Main',
+ 'Traccar.view.MainMobile',
+ 'Traccar.model.Position'
+ ],
+
+ init: function () {
+ var i, data, attribute, chartTypesStore, maintenanceTypesStore;
+ chartTypesStore = Ext.getStore('ReportChartTypes');
+ maintenanceTypesStore = Ext.getStore('MaintenanceTypes');
+ Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
+ data = Ext.getStore('PositionAttributes').getData().items;
+ for (i = 0; i < data.length; i++) {
+ attribute = data[i];
+ Traccar.model.Position.addFields([{
+ name: 'attribute.' + attribute.get('key'),
+ attributeKey: attribute.get('key'),
+ calculate: this.calculateAttribute,
+ persist: false
+ }]);
+ if (attribute.get('valueType') === 'number') {
+ chartTypesStore.add({
+ key: 'attribute.' + attribute.get('key'),
+ name: attribute.get('name')
+ });
+ maintenanceTypesStore.add(attribute);
+ }
+ }
+ },
+
+ calculateAttribute: function (data) {
+ var value = data.attributes[this.attributeKey];
+ if (value !== undefined) {
+ return Traccar.AttributeFormatter.getAttributeConverter(this.attributeKey)(value);
+ }
+ return value;
+ },
+
+ onLaunch: function () {
+ Ext.Ajax.request({
+ scope: this,
+ url: 'api/server',
+ callback: this.onServerReturn
+ });
+ },
+
+ showAnnouncement: function (announcement) {
+ var maxWidth = Ext.getBody().getViewSize().width - 2 * Traccar.Style.normalPadding;
+ if (maxWidth > Traccar.Style.windowWidth) {
+ maxWidth = Traccar.Style.windowWidth;
+ }
+ Ext.Msg.show({
+ msg: announcement,
+ buttons: Ext.Msg.OK,
+ closable: false,
+ modal: false,
+ maxWidth: maxWidth
+ }).alignTo(Ext.getBody(), 't-t', [0, Traccar.Style.normalPadding]);
+ },
+
+ onServerReturn: function (options, success, response) {
+ var announcement, token, parameters = {};
+ if (success) {
+ Traccar.app.setServer(Ext.decode(response.responseText));
+ announcement = Traccar.app.getServer().get('announcement');
+ if (announcement) {
+ this.showAnnouncement(announcement);
+ }
+ token = Ext.Object.fromQueryString(window.location.search).token;
+ if (token) {
+ parameters.token = token;
+ }
+ Ext.Ajax.request({
+ scope: this,
+ url: 'api/session',
+ method: 'GET',
+ params: parameters,
+ callback: this.onSessionReturn
+ });
+ } else {
+ Traccar.app.showError(response);
+ }
+ },
+
+ onSessionReturn: function (options, success, response) {
+ var passwordReset, dialog;
+ Ext.get('spinner').setVisible(false);
+ if (success) {
+ Traccar.app.setUser(Ext.decode(response.responseText));
+ this.loadApp();
+ } else {
+ this.login = Ext.create('widget.login', {
+ listeners: {
+ scope: this,
+ login: this.onLogin
+ }
+ });
+ this.login.show();
+
+ passwordReset = Ext.Object.fromQueryString(window.location.search).passwordReset;
+ if (passwordReset) {
+ dialog = Ext.Msg.prompt(Strings.loginReset, Strings.userPassword, function (btn, text) {
+ dialog.textField.inputEl.dom.type = 'text';
+ if (btn === 'ok') {
+ Ext.Ajax.request({
+ scope: this,
+ method: 'POST',
+ url: 'api/password/update',
+ params: {
+ token: passwordReset,
+ password: text
+ },
+ callback: function (options, success, response) {
+ if (success) {
+ Traccar.app.showToast(Strings.loginUpdateSuccess);
+ this.removeUrlParameter('passwordReset');
+ } else {
+ Traccar.app.showError(response.responseText);
+ }
+ }
+ });
+ }
+ }, this);
+ dialog.textField.inputEl.dom.type = 'password';
+ }
+ }
+ },
+
+ onLogin: function () {
+ this.login.close();
+ this.loadApp();
+ },
+
+ loadApp: function () {
+ var updateView, attributionView, eventId;
+
+ if (window.webkit && window.webkit.messageHandlers.appInterface) {
+ window.webkit.messageHandlers.appInterface.postMessage('login');
+ }
+ if (window.appInterface) {
+ window.appInterface.postMessage('login');
+ }
+
+ Ext.getStore('Groups').load();
+ Ext.getStore('Drivers').load();
+ Ext.getStore('Geofences').load();
+ Ext.getStore('Calendars').load();
+ Ext.getStore('Maintenances').load();
+ Ext.getStore('ComputedAttributes').load();
+ Ext.getStore('AllCommandTypes').load();
+ Ext.getStore('Commands').load();
+ Ext.getStore('AllNotificationTypes').load({
+ callback: function (records, operation, success) {
+ var store = Ext.getStore('ReportEventTypes');
+ if (success) {
+ store.add({
+ type: Traccar.store.ReportEventTypes.allEvents,
+ name: Strings.eventAll
+ });
+ store.loadData(records, true);
+ }
+ }
+ });
+ Ext.getStore('AllNotificators').load();
+ Ext.getStore('Notifications').load();
+
+ Ext.getStore('ServerAttributes').loadData(Ext.getStore('CommonDeviceAttributes').getData().items, true);
+ Ext.getStore('ServerAttributes').loadData(Ext.getStore('CommonUserAttributes').getData().items, true);
+ Ext.getStore('UserAttributes').loadData(Ext.getStore('CommonUserAttributes').getData().items, true);
+ Ext.getStore('DeviceAttributes').loadData(Ext.getStore('CommonDeviceAttributes').getData().items, true);
+ Ext.getStore('GroupAttributes').loadData(Ext.getStore('CommonDeviceAttributes').getData().items, true);
+
+ Ext.getStore('Devices').load({
+ scope: this,
+ callback: function () {
+ this.asyncUpdate(true);
+ }
+ });
+ updateView = Ext.get('update');
+ if (updateView) {
+ updateView.remove();
+ }
+ attributionView = Ext.get('attribution');
+ if (attributionView) {
+ attributionView.remove();
+ }
+ if (Traccar.app.isMobile()) {
+ Ext.create('widget.mainMobile');
+ } else {
+ Ext.create('widget.main');
+ }
+ eventId = Ext.Object.fromQueryString(window.location.search).eventId;
+ if (eventId) {
+ this.fireEvent('showsingleevent', eventId);
+ this.removeUrlParameter('eventId');
+ }
+ },
+
+ beep: function () {
+ if (!this.beepSound) {
+ this.beepSound = new Audio('beep.wav');
+ }
+ this.beepSound.play();
+ },
+
+ soundPressed: function () {
+ var soundButton = Ext.getCmp('soundButton');
+ return soundButton && soundButton.pressed;
+ },
+
+ removeUrlParameter: function (param) {
+ var params = Ext.Object.fromQueryString(window.location.search);
+ delete params[param];
+ if (Ext.Object.isEmpty(params)) {
+ window.history.pushState(null, null, window.location.pathname);
+ } else {
+ window.history.pushState(null, null, window.location.pathname + '?' + Ext.Object.toQueryString(params));
+ }
+ },
+
+ asyncUpdate: function (first) {
+ var self = this, protocol, pathname, socket;
+ protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
+ pathname = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1);
+ socket = new WebSocket(protocol + '//' + window.location.host + pathname + 'api/socket');
+
+ socket.onclose = function () {
+ Ext.Ajax.request({
+ url: 'api/devices',
+ success: function (response) {
+ self.updateDevices(Ext.decode(response.responseText));
+ },
+ failure: function (response) {
+ if (response.status === 401) {
+ window.location.reload();
+ }
+ }
+ });
+
+ Ext.Ajax.request({
+ url: 'api/positions',
+ headers: {
+ Accept: 'application/json'
+ },
+ success: function (response) {
+ self.updatePositions(Ext.decode(response.responseText));
+ }
+ });
+
+ setTimeout(function () {
+ self.asyncUpdate(false);
+ }, Traccar.Style.reconnectTimeout);
+ };
+
+ socket.onmessage = function (event) {
+ var data = Ext.decode(event.data);
+
+ if (data.devices) {
+ self.updateDevices(data.devices);
+ }
+ if (data.positions) {
+ self.updatePositions(data.positions, first);
+ first = false;
+ }
+ if (data.events) {
+ self.updateEvents(data.events);
+ }
+ };
+ },
+
+ updateDevices: function (array) {
+ var i, store, entity;
+ store = Ext.getStore('Devices');
+ for (i = 0; i < array.length; i++) {
+ entity = store.getById(array[i].id);
+ if (entity) {
+ entity.set({
+ status: array[i].status,
+ lastUpdate: array[i].lastUpdate
+ }, {
+ dirty: false
+ });
+ }
+ }
+ },
+
+ updatePositions: function (array, first) {
+ 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);
+ if (entity) {
+ entity.set(array[i]);
+ } else {
+ store.add(Ext.create('Traccar.model.Position', array[i]));
+ }
+ if (Ext.getStore('Events').findRecord('positionId', array[i].id, 0, false, false, true)) {
+ Ext.getStore('EventPositions').add(Ext.create('Traccar.model.Position', array[i]));
+ }
+ }
+ if (first) {
+ 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);
+ }
+ }
+ if (!device) {
+ this.zoomToAllDevices();
+ }
+ }
+ },
+
+ updateEvents: function (array) {
+ var i, store, device;
+ store = Ext.getStore('Events');
+ for (i = 0; i < array.length; i++) {
+ store.insert(0, array[i]);
+ device = Ext.getStore('Devices').getById(array[i].deviceId);
+ if (device) {
+ if (this.soundPressed()) {
+ this.beep();
+ }
+ Traccar.app.showToast(array[i].text, device.get('name'));
+ } else {
+ Traccar.app.showToast(array[i].text);
+ }
+ }
+ },
+
+ zoomToAllDevices: function () {
+ var lat, lon, zoom;
+ lat = Traccar.app.getPreference('latitude', 0);
+ lon = Traccar.app.getPreference('longitude', 0);
+ zoom = Traccar.app.getPreference('zoom', 0);
+ if (lat === 0 && lon === 0 && zoom === 0) {
+ this.fireEvent('zoomtoalldevices');
+ }
+ }
+});
diff --git a/legacy/web/app/model/Attribute.js b/legacy/web/app/model/Attribute.js
new file mode 100644
index 00000000..b1586a73
--- /dev/null
+++ b/legacy/web/app/model/Attribute.js
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Attribute', {
+ extend: 'Ext.data.Model',
+
+ fields: [{
+ name: 'priority',
+ type: 'int'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'value'
+ }, {
+ name: 'attribute',
+ type: 'string'
+ }]
+});
diff --git a/legacy/web/app/model/Calendar.js b/legacy/web/app/model/Calendar.js
new file mode 100644
index 00000000..8c44d625
--- /dev/null
+++ b/legacy/web/app/model/Calendar.js
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Calendar', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'data'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/Command.js b/legacy/web/app/model/Command.js
new file mode 100644
index 00000000..f64d2a4b
--- /dev/null
+++ b/legacy/web/app/model/Command.js
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Command', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'description',
+ type: 'string'
+ }, {
+ name: 'deviceId',
+ type: 'int'
+ }, {
+ name: 'type',
+ type: 'string'
+ }, {
+ name: 'textChannel',
+ type: 'boolean'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/ComputedAttribute.js b/legacy/web/app/model/ComputedAttribute.js
new file mode 100644
index 00000000..16a78ef1
--- /dev/null
+++ b/legacy/web/app/model/ComputedAttribute.js
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.ComputedAttribute', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'description',
+ type: 'string'
+ }, {
+ name: 'type',
+ type: 'string'
+ }, {
+ name: 'attribute',
+ type: 'string'
+ }, {
+ name: 'expression',
+ type: 'string'
+ }]
+});
diff --git a/legacy/web/app/model/Device.js b/legacy/web/app/model/Device.js
new file mode 100644
index 00000000..ca1e07a6
--- /dev/null
+++ b/legacy/web/app/model/Device.js
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Device', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'uniqueId',
+ type: 'string'
+ }, {
+ name: 'phone',
+ type: 'string',
+ allowNull: true
+ }, {
+ name: 'model',
+ type: 'string',
+ allowNull: true
+ }, {
+ name: 'contact',
+ type: 'string',
+ allowNull: true
+ }, {
+ name: 'category',
+ type: 'string',
+ allowNull: true
+ }, {
+ name: 'status',
+ type: 'string',
+ allowNull: true
+ }, {
+ name: 'lastUpdate',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'groupId',
+ type: 'int'
+ }, {
+ name: 'disabled',
+ type: 'boolean'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/Driver.js b/legacy/web/app/model/Driver.js
new file mode 100644
index 00000000..3c3b30e5
--- /dev/null
+++ b/legacy/web/app/model/Driver.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Driver', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'uniqueId',
+ type: 'string'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/Event.js b/legacy/web/app/model/Event.js
new file mode 100644
index 00000000..d1297dd7
--- /dev/null
+++ b/legacy/web/app/model/Event.js
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Event', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'type',
+ type: 'string'
+ }, {
+ name: 'eventTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'deviceId',
+ type: 'int'
+ }, {
+ name: 'positionId',
+ type: 'int'
+ }, {
+ name: 'geofenceId',
+ type: 'int'
+ }, {
+ name: 'maintenanceId',
+ type: 'int'
+ }, {
+ name: 'text',
+ convert: function (v, rec) {
+ var text, alarmKey, geofence, maintenance;
+ if (rec.get('type') === 'commandResult') {
+ text = Strings.eventCommandResult + ': ' + rec.get('attributes')['result'];
+ } else if (rec.get('type') === 'alarm') {
+ alarmKey = rec.get('attributes')['alarm'];
+ alarmKey = 'alarm' + alarmKey.charAt(0).toUpperCase() + alarmKey.slice(1);
+ text = Strings[alarmKey] || alarmKey;
+ } else if (rec.get('type') === 'textMessage') {
+ text = Strings.eventTextMessage + ': ' + rec.get('attributes')['message'];
+ } else if (rec.get('type') === 'driverChanged') {
+ text = Strings.eventDriverChanged + ': ' +
+ Traccar.AttributeFormatter.driverUniqueIdFormatter(rec.get('attributes')['driverUniqueId']);
+ } else {
+ text = Traccar.app.getEventString(rec.get('type'));
+ }
+ if (rec.get('geofenceId')) {
+ geofence = Ext.getStore('Geofences').getById(rec.get('geofenceId'));
+ if (geofence) {
+ text += ' "' + geofence.get('name') + '"';
+ }
+ }
+ if (rec.get('maintenanceId')) {
+ maintenance = Ext.getStore('Maintenances').getById(rec.get('maintenanceId'));
+ if (maintenance) {
+ text += ' "' + maintenance.get('name') + '"';
+ }
+ }
+ return text;
+ },
+ depends: ['type', 'attributes', 'geofenceId', 'maintenanceId']
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/Geofence.js b/legacy/web/app/model/Geofence.js
new file mode 100644
index 00000000..12a9f878
--- /dev/null
+++ b/legacy/web/app/model/Geofence.js
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Geofence', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'description',
+ type: 'string'
+ }, {
+ name: 'area',
+ type: 'string'
+ }, {
+ name: 'calendarId',
+ type: 'int'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/Group.js b/legacy/web/app/model/Group.js
new file mode 100644
index 00000000..8230fda1
--- /dev/null
+++ b/legacy/web/app/model/Group.js
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Group', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'groupId',
+ type: 'int'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/KnownAttribute.js b/legacy/web/app/model/KnownAttribute.js
new file mode 100644
index 00000000..f6f41a73
--- /dev/null
+++ b/legacy/web/app/model/KnownAttribute.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.model.KnownAttribute', {
+ extend: 'Ext.data.Model',
+ idProperty: 'key',
+
+ fields: [{
+ name: 'key',
+ type: 'string'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'valueType',
+ type: 'string'
+ }, {
+ name: 'dataType',
+ type: 'string'
+ }]
+});
diff --git a/legacy/web/app/model/KnownCommand.js b/legacy/web/app/model/KnownCommand.js
new file mode 100644
index 00000000..06610e32
--- /dev/null
+++ b/legacy/web/app/model/KnownCommand.js
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.model.KnownCommand', {
+ extend: 'Ext.data.Model',
+ idProperty: 'type',
+
+ fields: [{
+ name: 'type',
+ type: 'string'
+ }, {
+ name: 'name',
+ convert: function (v, rec) {
+ return Traccar.AttributeFormatter.getFormatter('commandType')(rec.get('type'));
+ },
+ depends: ['type']
+ }, {
+ name: 'parameters'
+ }]
+});
diff --git a/legacy/web/app/model/KnownNotification.js b/legacy/web/app/model/KnownNotification.js
new file mode 100644
index 00000000..f42ef972
--- /dev/null
+++ b/legacy/web/app/model/KnownNotification.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.model.KnownNotification', {
+ extend: 'Ext.data.Model',
+ idProperty: 'type',
+
+ fields: [{
+ name: 'type',
+ type: 'string'
+ }, {
+ name: 'name',
+ convert: function (v, rec) {
+ return Traccar.app.getEventString(rec.get('type'));
+ },
+ depends: ['type']
+ }]
+});
diff --git a/legacy/web/app/model/KnownNotificator.js b/legacy/web/app/model/KnownNotificator.js
new file mode 100644
index 00000000..7855a12b
--- /dev/null
+++ b/legacy/web/app/model/KnownNotificator.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.model.KnownNotificator', {
+ extend: 'Ext.data.Model',
+ idProperty: 'type',
+
+ fields: [{
+ name: 'type',
+ type: 'string'
+ }, {
+ name: 'name',
+ convert: function (v, rec) {
+ return Traccar.app.getNotificatorString(rec.get('type'));
+ },
+ depends: ['type']
+ }]
+});
diff --git a/legacy/web/app/model/Maintenance.js b/legacy/web/app/model/Maintenance.js
new file mode 100644
index 00000000..a0654275
--- /dev/null
+++ b/legacy/web/app/model/Maintenance.js
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Maintenance', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'type',
+ type: 'string'
+ }, {
+ name: 'start',
+ type: 'float'
+ }, {
+ name: 'period',
+ type: 'float'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/Notification.js b/legacy/web/app/model/Notification.js
new file mode 100644
index 00000000..fc9d84d7
--- /dev/null
+++ b/legacy/web/app/model/Notification.js
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Notification', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'type',
+ type: 'string'
+ }, {
+ name: 'always',
+ type: 'bool'
+ }, {
+ name: 'attributes'
+ }, {
+ name: 'notificators',
+ type: 'string'
+ }, {
+ name: 'calendarId',
+ type: 'int'
+ }]
+});
diff --git a/legacy/web/app/model/Position.js b/legacy/web/app/model/Position.js
new file mode 100644
index 00000000..6db54653
--- /dev/null
+++ b/legacy/web/app/model/Position.js
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Position', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'protocol',
+ type: 'string'
+ }, {
+ name: 'deviceId',
+ type: 'int'
+ }, {
+ name: 'serverTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'deviceTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'fixTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'valid',
+ type: 'boolean'
+ }, {
+ name: 'accuracy',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('accuracy')
+ }, {
+ name: 'latitude',
+ type: 'float'
+ }, {
+ name: 'longitude',
+ type: 'float'
+ }, {
+ name: 'altitude',
+ type: 'float'
+ }, {
+ name: 'speed',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('speed')
+ }, {
+ name: 'course',
+ type: 'float'
+ }, {
+ name: 'address',
+ type: 'string'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/ReportStop.js b/legacy/web/app/model/ReportStop.js
new file mode 100644
index 00000000..9aaa58b0
--- /dev/null
+++ b/legacy/web/app/model/ReportStop.js
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.ReportStop', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'deviceId',
+ type: 'int'
+ }, {
+ name: 'deviceName',
+ type: 'string'
+ }, {
+ name: 'duration',
+ type: 'int'
+ }, {
+ name: 'startTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'startOdometer',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('distance')
+ }, {
+ name: 'address',
+ type: 'string'
+ }, {
+ name: 'endTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'engineHours',
+ type: 'int'
+ }, {
+ name: 'positionId',
+ type: 'int'
+ }, {
+ name: 'spentFuel',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('spentFuel')
+ }]
+});
diff --git a/legacy/web/app/model/ReportSummary.js b/legacy/web/app/model/ReportSummary.js
new file mode 100644
index 00000000..559ffd41
--- /dev/null
+++ b/legacy/web/app/model/ReportSummary.js
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.ReportSummary', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'deviceId',
+ type: 'int'
+ }, {
+ name: 'deviceName',
+ type: 'string'
+ }, {
+ name: 'startTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'maxSpeed',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('speed')
+ }, {
+ name: 'averageSpeed',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('speed')
+ }, {
+ name: 'distance',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('distance')
+ }, {
+ name: 'startOdometer',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('distance')
+ }, {
+ name: 'endOdometer',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('distance')
+ }, {
+ name: 'engineHours',
+ type: 'int'
+ }, {
+ name: 'spentFuel',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('spentFuel')
+ }]
+});
diff --git a/legacy/web/app/model/ReportTrip.js b/legacy/web/app/model/ReportTrip.js
new file mode 100644
index 00000000..9d45fc87
--- /dev/null
+++ b/legacy/web/app/model/ReportTrip.js
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.ReportTrip', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'deviceId',
+ type: 'int'
+ }, {
+ name: 'deviceName',
+ type: 'string'
+ }, {
+ name: 'maxSpeed',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('speed')
+ }, {
+ name: 'averageSpeed',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('speed')
+ }, {
+ name: 'distance',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('distance')
+ }, {
+ name: 'startOdometer',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('distance')
+ }, {
+ name: 'endOdometer',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('distance')
+ }, {
+ name: 'duration',
+ type: 'int'
+ }, {
+ name: 'startTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'startAddress',
+ type: 'string'
+ }, {
+ name: 'endTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'endAddress',
+ type: 'string'
+ }, {
+ name: 'spentFuel',
+ type: 'float',
+ convert: Traccar.AttributeFormatter.getConverter('spentFuel')
+ }, {
+ name: 'driverUniqueId',
+ type: 'string'
+ }, {
+ name: 'driverName',
+ type: 'string'
+ }]
+});
diff --git a/legacy/web/app/model/Server.js b/legacy/web/app/model/Server.js
new file mode 100644
index 00000000..177b4fc4
--- /dev/null
+++ b/legacy/web/app/model/Server.js
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2015 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Server', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'registration',
+ type: 'boolean'
+ }, {
+ name: 'readonly',
+ type: 'boolean'
+ }, {
+ name: 'deviceReadonly',
+ type: 'boolean'
+ }, {
+ name: 'limitCommands',
+ type: 'boolean'
+ }, {
+ name: 'disableReports',
+ type: 'boolean'
+ }, {
+ name: 'map',
+ type: 'string'
+ }, {
+ name: 'bingKey',
+ type: 'string'
+ }, {
+ name: 'mapUrl',
+ type: 'string'
+ }, {
+ name: 'latitude',
+ type: 'float'
+ }, {
+ name: 'longitude',
+ type: 'float'
+ }, {
+ name: 'zoom',
+ type: 'int'
+ }, {
+ name: 'twelveHourFormat',
+ type: 'boolean'
+ }, {
+ name: 'forceSettings',
+ type: 'boolean'
+ }, {
+ name: 'coordinateFormat',
+ type: 'string'
+ }, {
+ name: 'poiLayer',
+ type: 'string'
+ }, {
+ name: 'announcement',
+ type: 'string'
+ }, {
+ name: 'attributes'
+ }],
+
+ proxy: {
+ type: 'ajax',
+ url: 'api/server',
+ actionMethods: {
+ update: 'PUT'
+ },
+ writer: {
+ type: 'json',
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/model/Statistics.js b/legacy/web/app/model/Statistics.js
new file mode 100644
index 00000000..95280ac4
--- /dev/null
+++ b/legacy/web/app/model/Statistics.js
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.Statistics', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'captureTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'activeUsers',
+ type: 'int'
+ }, {
+ name: 'activeDevices',
+ type: 'int'
+ }, {
+ name: 'requests',
+ type: 'int'
+ }, {
+ name: 'messagesReceived',
+ type: 'int'
+ }, {
+ name: 'messagesStored',
+ type: 'int'
+ }, {
+ name: 'mailSent',
+ type: 'int'
+ }, {
+ name: 'smsSent',
+ type: 'int'
+ }, {
+ name: 'geocoderRequests',
+ type: 'int'
+ }, {
+ name: 'geolocationRequests',
+ type: 'int'
+ }, {
+ name: 'attributes'
+ }]
+});
diff --git a/legacy/web/app/model/User.js b/legacy/web/app/model/User.js
new file mode 100644
index 00000000..455bca64
--- /dev/null
+++ b/legacy/web/app/model/User.js
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2015 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.model.User', {
+ extend: 'Ext.data.Model',
+ identifier: 'negative',
+
+ fields: [{
+ name: 'id',
+ type: 'int'
+ }, {
+ name: 'name',
+ type: 'string'
+ }, {
+ name: 'login',
+ type: 'string'
+ }, {
+ name: 'email',
+ type: 'string'
+ }, {
+ name: 'password',
+ type: 'string'
+ }, {
+ name: 'phone',
+ type: 'string'
+ }, {
+ name: 'readonly',
+ type: 'boolean'
+ }, {
+ name: 'administrator',
+ type: 'boolean'
+ }, {
+ name: 'map',
+ type: 'string'
+ }, {
+ name: 'latitude',
+ type: 'float'
+ }, {
+ name: 'longitude',
+ type: 'float'
+ }, {
+ name: 'zoom',
+ type: 'int'
+ }, {
+ name: 'twelveHourFormat',
+ type: 'boolean'
+ }, {
+ name: 'coordinateFormat',
+ type: 'string'
+ }, {
+ name: 'disabled',
+ type: 'boolean'
+ }, {
+ name: 'expirationTime',
+ type: 'date',
+ dateFormat: 'c'
+ }, {
+ name: 'deviceLimit',
+ type: 'int'
+ }, {
+ name: 'userLimit',
+ type: 'int'
+ }, {
+ name: 'deviceReadonly',
+ type: 'boolean'
+ }, {
+ name: 'limitCommands',
+ type: 'boolean'
+ }, {
+ name: 'disableReports',
+ type: 'boolean'
+ }, {
+ name: 'poiLayer',
+ type: 'string'
+ }, {
+ name: 'attributes'
+ }],
+
+ proxy: {
+ type: 'rest',
+ url: 'api/users',
+ writer: {
+ type: 'json',
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AlarmTypes.js b/legacy/web/app/store/AlarmTypes.js
new file mode 100644
index 00000000..1ee7ffe8
--- /dev/null
+++ b/legacy/web/app/store/AlarmTypes.js
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.AlarmTypes', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name'],
+
+ data: (function () {
+ var key, items = [];
+ for (key in Strings) {
+ if (Strings.hasOwnProperty(key) && key.lastIndexOf('alarm', 0) === 0) {
+ items.push({
+ key: key.charAt(5).toLowerCase() + key.slice(6),
+ name: Strings[key]
+ });
+ }
+ }
+ return items;
+ })()
+});
diff --git a/legacy/web/app/store/AllCalendars.js b/legacy/web/app/store/AllCalendars.js
new file mode 100644
index 00000000..26557287
--- /dev/null
+++ b/legacy/web/app/store/AllCalendars.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllCalendars', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Calendar',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/calendars',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllCommandTypes.js b/legacy/web/app/store/AllCommandTypes.js
new file mode 100644
index 00000000..c35f50d9
--- /dev/null
+++ b/legacy/web/app/store/AllCommandTypes.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllCommandTypes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownCommand',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/commands/types',
+ listeners: {
+ exception: function (proxy, response) {
+ Traccar.app.showError(response);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllCommands.js b/legacy/web/app/store/AllCommands.js
new file mode 100644
index 00000000..7f5e1253
--- /dev/null
+++ b/legacy/web/app/store/AllCommands.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllCommands', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Command',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/commands',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllComputedAttributes.js b/legacy/web/app/store/AllComputedAttributes.js
new file mode 100644
index 00000000..e63feb14
--- /dev/null
+++ b/legacy/web/app/store/AllComputedAttributes.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllComputedAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.ComputedAttribute',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/attributes/computed',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllDevices.js b/legacy/web/app/store/AllDevices.js
new file mode 100644
index 00000000..338e6be7
--- /dev/null
+++ b/legacy/web/app/store/AllDevices.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllDevices', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Device',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/devices',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllDrivers.js b/legacy/web/app/store/AllDrivers.js
new file mode 100644
index 00000000..9d723885
--- /dev/null
+++ b/legacy/web/app/store/AllDrivers.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllDrivers', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Driver',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/drivers',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllGeofences.js b/legacy/web/app/store/AllGeofences.js
new file mode 100644
index 00000000..4042732b
--- /dev/null
+++ b/legacy/web/app/store/AllGeofences.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllGeofences', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Geofence',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/geofences',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllGroups.js b/legacy/web/app/store/AllGroups.js
new file mode 100644
index 00000000..ba02e715
--- /dev/null
+++ b/legacy/web/app/store/AllGroups.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllGroups', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Group',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/groups',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllMaintenances.js b/legacy/web/app/store/AllMaintenances.js
new file mode 100644
index 00000000..8435ad40
--- /dev/null
+++ b/legacy/web/app/store/AllMaintenances.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllMaintenances', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Maintenance',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/maintenance',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllNotificationTypes.js b/legacy/web/app/store/AllNotificationTypes.js
new file mode 100644
index 00000000..63fec1bc
--- /dev/null
+++ b/legacy/web/app/store/AllNotificationTypes.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllNotificationTypes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownNotification',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/notifications/types',
+ listeners: {
+ exception: function (proxy, response) {
+ Traccar.app.showError(response);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllNotifications.js b/legacy/web/app/store/AllNotifications.js
new file mode 100644
index 00000000..a3e59e15
--- /dev/null
+++ b/legacy/web/app/store/AllNotifications.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllNotifications', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Notification',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/notifications',
+ extraParams: {
+ all: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllNotificators.js b/legacy/web/app/store/AllNotificators.js
new file mode 100644
index 00000000..d81b02fd
--- /dev/null
+++ b/legacy/web/app/store/AllNotificators.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.AllNotificators', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownNotificator',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/notifications/notificators',
+ listeners: {
+ exception: function (proxy, response) {
+ Traccar.app.showError(response);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/AllTimezones.js b/legacy/web/app/store/AllTimezones.js
new file mode 100644
index 00000000..2a7fa371
--- /dev/null
+++ b/legacy/web/app/store/AllTimezones.js
@@ -0,0 +1,798 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.AllTimezones', {
+ extend: 'Ext.data.Store',
+ fields: ['key'],
+
+ sorters: {
+ property: 'key',
+ direction: 'ASC'
+ },
+
+ data: [{
+ key: 'Africa/Abidjan'
+ }, {
+ key: 'Africa/Accra'
+ }, {
+ key: 'Africa/Bissau'
+ }, {
+ key: 'Africa/Casablanca'
+ }, {
+ key: 'Africa/El_Aaiun'
+ }, {
+ key: 'Africa/Monrovia'
+ }, {
+ key: 'America/Danmarkshavn'
+ }, {
+ key: 'Antarctica/Troll'
+ }, {
+ key: 'Atlantic/Canary'
+ }, {
+ key: 'Atlantic/Faroe'
+ }, {
+ key: 'Atlantic/Madeira'
+ }, {
+ key: 'Atlantic/Reykjavik'
+ }, {
+ key: 'GMT'
+ }, {
+ key: 'Etc/GMT'
+ }, {
+ key: 'Etc/UCT'
+ }, {
+ key: 'Etc/UTC'
+ }, {
+ key: 'Europe/Dublin'
+ }, {
+ key: 'Europe/Lisbon'
+ }, {
+ key: 'Europe/London'
+ }, {
+ key: 'WET'
+ }, {
+ key: 'Africa/Algiers'
+ }, {
+ key: 'Africa/Ceuta'
+ }, {
+ key: 'Africa/Lagos'
+ }, {
+ key: 'Africa/Ndjamena'
+ }, {
+ key: 'Africa/Tunis'
+ }, {
+ key: 'Africa/Windhoek'
+ }, {
+ key: 'CET'
+ }, {
+ key: 'Etc/GMT-1'
+ }, {
+ key: 'Europe/Amsterdam'
+ }, {
+ key: 'Europe/Andorra'
+ }, {
+ key: 'Europe/Belgrade'
+ }, {
+ key: 'Europe/Berlin'
+ }, {
+ key: 'Europe/Brussels'
+ }, {
+ key: 'Europe/Budapest'
+ }, {
+ key: 'Europe/Copenhagen'
+ }, {
+ key: 'Europe/Gibraltar'
+ }, {
+ key: 'Europe/Luxembourg'
+ }, {
+ key: 'Europe/Madrid'
+ }, {
+ key: 'Europe/Malta'
+ }, {
+ key: 'Europe/Monaco'
+ }, {
+ key: 'Europe/Oslo'
+ }, {
+ key: 'Europe/Paris'
+ }, {
+ key: 'Europe/Prague'
+ }, {
+ key: 'Europe/Rome'
+ }, {
+ key: 'Europe/Stockholm'
+ }, {
+ key: 'Europe/Tirane'
+ }, {
+ key: 'Europe/Vienna'
+ }, {
+ key: 'Europe/Warsaw'
+ }, {
+ key: 'Europe/Zurich'
+ }, {
+ key: 'MET'
+ }, {
+ key: 'Africa/Cairo'
+ }, {
+ key: 'Africa/Johannesburg'
+ }, {
+ key: 'Africa/Maputo'
+ }, {
+ key: 'Africa/Tripoli'
+ }, {
+ key: 'Asia/Amman'
+ }, {
+ key: 'Asia/Beirut'
+ }, {
+ key: 'Asia/Damascus'
+ }, {
+ key: 'Asia/Gaza'
+ }, {
+ key: 'Asia/Hebron'
+ }, {
+ key: 'Asia/Jerusalem'
+ }, {
+ key: 'Asia/Nicosia'
+ }, {
+ key: 'EET'
+ }, {
+ key: 'Etc/GMT-2'
+ }, {
+ key: 'Europe/Athens'
+ }, {
+ key: 'Europe/Bucharest'
+ }, {
+ key: 'Europe/Chisinau'
+ }, {
+ key: 'Europe/Helsinki'
+ }, {
+ key: 'Europe/Kaliningrad'
+ }, {
+ key: 'Europe/Kiev'
+ }, {
+ key: 'Europe/Riga'
+ }, {
+ key: 'Europe/Sofia'
+ }, {
+ key: 'Europe/Tallinn'
+ }, {
+ key: 'Europe/Uzhgorod'
+ }, {
+ key: 'Europe/Vilnius'
+ }, {
+ key: 'Europe/Zaporozhye'
+ }, {
+ key: 'Africa/Khartoum'
+ }, {
+ key: 'Africa/Nairobi'
+ }, {
+ key: 'Antarctica/Syowa'
+ }, {
+ key: 'Asia/Baghdad'
+ }, {
+ key: 'Asia/Famagusta'
+ }, {
+ key: 'Asia/Qatar'
+ }, {
+ key: 'Asia/Riyadh'
+ }, {
+ key: 'Etc/GMT-3'
+ }, {
+ key: 'Europe/Istanbul'
+ }, {
+ key: 'Europe/Kirov'
+ }, {
+ key: 'Europe/Minsk'
+ }, {
+ key: 'Europe/Moscow'
+ }, {
+ key: 'Europe/Simferopol'
+ }, {
+ key: 'Europe/Volgograd'
+ }, {
+ key: 'Asia/Tehran'
+ }, {
+ key: 'Asia/Baku'
+ }, {
+ key: 'Asia/Dubai'
+ }, {
+ key: 'Asia/Tbilisi'
+ }, {
+ key: 'Asia/Yerevan'
+ }, {
+ key: 'Etc/GMT-4'
+ }, {
+ key: 'Europe/Astrakhan'
+ }, {
+ key: 'Europe/Samara'
+ }, {
+ key: 'Europe/Saratov'
+ }, {
+ key: 'Europe/Ulyanovsk'
+ }, {
+ key: 'Indian/Mahe'
+ }, {
+ key: 'Indian/Mauritius'
+ }, {
+ key: 'Indian/Reunion'
+ }, {
+ key: 'Asia/Kabul'
+ }, {
+ key: 'Antarctica/Mawson'
+ }, {
+ key: 'Asia/Aqtau'
+ }, {
+ key: 'Asia/Aqtobe'
+ }, {
+ key: 'Asia/Ashgabat'
+ }, {
+ key: 'Asia/Atyrau'
+ }, {
+ key: 'Asia/Dushanbe'
+ }, {
+ key: 'Asia/Karachi'
+ }, {
+ key: 'Asia/Oral'
+ }, {
+ key: 'Asia/Samarkand'
+ }, {
+ key: 'Asia/Tashkent'
+ }, {
+ key: 'Asia/Yekaterinburg'
+ }, {
+ key: 'Etc/GMT-5'
+ }, {
+ key: 'Indian/Kerguelen'
+ }, {
+ key: 'Indian/Maldives'
+ }, {
+ key: 'Asia/Colombo'
+ }, {
+ key: 'Asia/Kolkata'
+ }, {
+ key: 'Asia/Kathmandu'
+ }, {
+ key: 'Antarctica/Vostok'
+ }, {
+ key: 'Asia/Almaty'
+ }, {
+ key: 'Asia/Bishkek'
+ }, {
+ key: 'Asia/Dhaka'
+ }, {
+ key: 'Asia/Omsk'
+ }, {
+ key: 'Asia/Qyzylorda'
+ }, {
+ key: 'Asia/Thimphu'
+ }, {
+ key: 'Asia/Urumqi'
+ }, {
+ key: 'Etc/GMT-6'
+ }, {
+ key: 'Indian/Chagos'
+ }, {
+ key: 'Asia/Yangon'
+ }, {
+ key: 'Indian/Cocos'
+ }, {
+ key: 'Antarctica/Davis'
+ }, {
+ key: 'Asia/Bangkok'
+ }, {
+ key: 'Asia/Barnaul'
+ }, {
+ key: 'Asia/Ho_Chi_Minh'
+ }, {
+ key: 'Asia/Hovd'
+ }, {
+ key: 'Asia/Jakarta'
+ }, {
+ key: 'Asia/Krasnoyarsk'
+ }, {
+ key: 'Asia/Novokuznetsk'
+ }, {
+ key: 'Asia/Novosibirsk'
+ }, {
+ key: 'Asia/Pontianak'
+ }, {
+ key: 'Asia/Tomsk'
+ }, {
+ key: 'Etc/GMT-7'
+ }, {
+ key: 'Indian/Christmas'
+ }, {
+ key: 'Asia/Brunei'
+ }, {
+ key: 'Asia/Choibalsan'
+ }, {
+ key: 'Asia/Hong_Kong'
+ }, {
+ key: 'Asia/Irkutsk'
+ }, {
+ key: 'Asia/Kuala_Lumpur'
+ }, {
+ key: 'Asia/Kuching'
+ }, {
+ key: 'Asia/Macau'
+ }, {
+ key: 'Asia/Makassar'
+ }, {
+ key: 'Asia/Manila'
+ }, {
+ key: 'Asia/Shanghai'
+ }, {
+ key: 'Asia/Singapore'
+ }, {
+ key: 'Asia/Taipei'
+ }, {
+ key: 'Asia/Ulaanbaatar'
+ }, {
+ key: 'Australia/Perth'
+ }, {
+ key: 'Etc/GMT-8'
+ }, {
+ key: 'Asia/Pyongyang'
+ }, {
+ key: 'Australia/Eucla'
+ }, {
+ key: 'Asia/Chita'
+ }, {
+ key: 'Asia/Dili'
+ }, {
+ key: 'Asia/Jayapura'
+ }, {
+ key: 'Asia/Khandyga'
+ }, {
+ key: 'Asia/Seoul'
+ }, {
+ key: 'Asia/Tokyo'
+ }, {
+ key: 'Asia/Yakutsk'
+ }, {
+ key: 'Etc/GMT-9'
+ }, {
+ key: 'Pacific/Palau'
+ }, {
+ key: 'Australia/Adelaide'
+ }, {
+ key: 'Australia/Broken_Hill'
+ }, {
+ key: 'Australia/Darwin'
+ }, {
+ key: 'Antarctica/DumontDUrville'
+ }, {
+ key: 'Asia/Ust-Nera'
+ }, {
+ key: 'Asia/Vladivostok'
+ }, {
+ key: 'Australia/Brisbane'
+ }, {
+ key: 'Australia/Currie'
+ }, {
+ key: 'Australia/Hobart'
+ }, {
+ key: 'Australia/Lindeman'
+ }, {
+ key: 'Australia/Melbourne'
+ }, {
+ key: 'Australia/Sydney'
+ }, {
+ key: 'Etc/GMT-10'
+ }, {
+ key: 'Pacific/Chuuk'
+ }, {
+ key: 'Pacific/Guam'
+ }, {
+ key: 'Pacific/Port_Moresby'
+ }, {
+ key: 'Australia/Lord_Howe'
+ }, {
+ key: 'Antarctica/Casey'
+ }, {
+ key: 'Antarctica/Macquarie'
+ }, {
+ key: 'Asia/Magadan'
+ }, {
+ key: 'Asia/Sakhalin'
+ }, {
+ key: 'Asia/Srednekolymsk'
+ }, {
+ key: 'Etc/GMT-11'
+ }, {
+ key: 'Pacific/Bougainville'
+ }, {
+ key: 'Pacific/Efate'
+ }, {
+ key: 'Pacific/Guadalcanal'
+ }, {
+ key: 'Pacific/Kosrae'
+ }, {
+ key: 'Pacific/Norfolk'
+ }, {
+ key: 'Pacific/Noumea'
+ }, {
+ key: 'Pacific/Pohnpei'
+ }, {
+ key: 'Asia/Anadyr'
+ }, {
+ key: 'Asia/Kamchatka'
+ }, {
+ key: 'Etc/GMT-12'
+ }, {
+ key: 'Pacific/Auckland'
+ }, {
+ key: 'Pacific/Fiji'
+ }, {
+ key: 'Pacific/Funafuti'
+ }, {
+ key: 'Pacific/Kwajalein'
+ }, {
+ key: 'Pacific/Majuro'
+ }, {
+ key: 'Pacific/Nauru'
+ }, {
+ key: 'Pacific/Tarawa'
+ }, {
+ key: 'Pacific/Wake'
+ }, {
+ key: 'Pacific/Wallis'
+ }, {
+ key: 'Pacific/Chatham'
+ }, {
+ key: 'Etc/GMT-13'
+ }, {
+ key: 'Pacific/Apia'
+ }, {
+ key: 'Pacific/Enderbury'
+ }, {
+ key: 'Pacific/Fakaofo'
+ }, {
+ key: 'Pacific/Tongatapu'
+ }, {
+ key: 'Etc/GMT-14'
+ }, {
+ key: 'Pacific/Kiritimati'
+ }, {
+ key: 'America/Scoresbysund'
+ }, {
+ key: 'Atlantic/Azores'
+ }, {
+ key: 'Atlantic/Cape_Verde'
+ }, {
+ key: 'Etc/GMT+1'
+ }, {
+ key: 'America/Noronha'
+ }, {
+ key: 'Atlantic/South_Georgia'
+ }, {
+ key: 'Etc/GMT+2'
+ }, {
+ key: 'America/Araguaina'
+ }, {
+ key: 'America/Argentina/Buenos_Aires'
+ }, {
+ key: 'America/Argentina/Catamarca'
+ }, {
+ key: 'America/Argentina/Cordoba'
+ }, {
+ key: 'America/Argentina/Jujuy'
+ }, {
+ key: 'America/Argentina/La_Rioja'
+ }, {
+ key: 'America/Argentina/Mendoza'
+ }, {
+ key: 'America/Argentina/Rio_Gallegos'
+ }, {
+ key: 'America/Argentina/Salta'
+ }, {
+ key: 'America/Argentina/San_Juan'
+ }, {
+ key: 'America/Argentina/San_Luis'
+ }, {
+ key: 'America/Argentina/Tucuman'
+ }, {
+ key: 'America/Argentina/Ushuaia'
+ }, {
+ key: 'America/Bahia'
+ }, {
+ key: 'America/Belem'
+ }, {
+ key: 'America/Cayenne'
+ }, {
+ key: 'America/Fortaleza'
+ }, {
+ key: 'America/Godthab'
+ }, {
+ key: 'America/Maceio'
+ }, {
+ key: 'America/Miquelon'
+ }, {
+ key: 'America/Montevideo'
+ }, {
+ key: 'America/Paramaribo'
+ }, {
+ key: 'America/Recife'
+ }, {
+ key: 'America/Santarem'
+ }, {
+ key: 'America/Sao_Paulo'
+ }, {
+ key: 'Antarctica/Rothera'
+ }, {
+ key: 'Atlantic/Stanley'
+ }, {
+ key: 'Etc/GMT+3'
+ }, {
+ key: 'America/St_Johns'
+ }, {
+ key: 'America/Asuncion'
+ }, {
+ key: 'America/Barbados'
+ }, {
+ key: 'America/Blanc-Sablon'
+ }, {
+ key: 'America/Boa_Vista'
+ }, {
+ key: 'America/Campo_Grande'
+ }, {
+ key: 'America/Caracas'
+ }, {
+ key: 'America/Cuiaba'
+ }, {
+ key: 'America/Curacao'
+ }, {
+ key: 'America/Glace_Bay'
+ }, {
+ key: 'America/Goose_Bay'
+ }, {
+ key: 'America/Grand_Turk'
+ }, {
+ key: 'America/Guyana'
+ }, {
+ key: 'America/Halifax'
+ }, {
+ key: 'America/La_Paz'
+ }, {
+ key: 'America/Manaus'
+ }, {
+ key: 'America/Martinique'
+ }, {
+ key: 'America/Moncton'
+ }, {
+ key: 'America/Port_of_Spain'
+ }, {
+ key: 'America/Porto_Velho'
+ }, {
+ key: 'America/Puerto_Rico'
+ }, {
+ key: 'America/Santiago'
+ }, {
+ key: 'America/Santo_Domingo'
+ }, {
+ key: 'America/Thule'
+ }, {
+ key: 'Antarctica/Palmer'
+ }, {
+ key: 'Atlantic/Bermuda'
+ }, {
+ key: 'Etc/GMT+4'
+ }, {
+ key: 'America/Atikokan'
+ }, {
+ key: 'America/Bogota'
+ }, {
+ key: 'America/Cancun'
+ }, {
+ key: 'America/Detroit'
+ }, {
+ key: 'America/Eirunepe'
+ }, {
+ key: 'America/Guayaquil'
+ }, {
+ key: 'America/Havana'
+ }, {
+ key: 'America/Indiana/Indianapolis'
+ }, {
+ key: 'America/Indiana/Marengo'
+ }, {
+ key: 'America/Indiana/Petersburg'
+ }, {
+ key: 'America/Indiana/Vevay'
+ }, {
+ key: 'America/Indiana/Vincennes'
+ }, {
+ key: 'America/Indiana/Winamac'
+ }, {
+ key: 'America/Iqaluit'
+ }, {
+ key: 'America/Jamaica'
+ }, {
+ key: 'America/Kentucky/Louisville'
+ }, {
+ key: 'America/Kentucky/Monticello'
+ }, {
+ key: 'America/Lima'
+ }, {
+ key: 'America/Nassau'
+ }, {
+ key: 'America/New_York'
+ }, {
+ key: 'America/Nipigon'
+ }, {
+ key: 'America/Panama'
+ }, {
+ key: 'America/Pangnirtung'
+ }, {
+ key: 'America/Port-au-Prince'
+ }, {
+ key: 'America/Rio_Branco'
+ }, {
+ key: 'America/Thunder_Bay'
+ }, {
+ key: 'America/Toronto'
+ }, {
+ key: 'EST'
+ }, {
+ key: 'EST5EDT'
+ }, {
+ key: 'Etc/GMT+5'
+ }, {
+ key: 'America/Bahia_Banderas'
+ }, {
+ key: 'America/Belize'
+ }, {
+ key: 'America/Chicago'
+ }, {
+ key: 'America/Costa_Rica'
+ }, {
+ key: 'America/El_Salvador'
+ }, {
+ key: 'America/Guatemala'
+ }, {
+ key: 'America/Indiana/Knox'
+ }, {
+ key: 'America/Indiana/Tell_City'
+ }, {
+ key: 'America/Managua'
+ }, {
+ key: 'America/Matamoros'
+ }, {
+ key: 'America/Menominee'
+ }, {
+ key: 'America/Merida'
+ }, {
+ key: 'America/Mexico_City'
+ }, {
+ key: 'America/Monterrey'
+ }, {
+ key: 'America/North_Dakota/Beulah'
+ }, {
+ key: 'America/North_Dakota/Center'
+ }, {
+ key: 'America/North_Dakota/New_Salem'
+ }, {
+ key: 'America/Rainy_River'
+ }, {
+ key: 'America/Rankin_Inlet'
+ }, {
+ key: 'America/Regina'
+ }, {
+ key: 'America/Resolute'
+ }, {
+ key: 'America/Swift_Current'
+ }, {
+ key: 'America/Tegucigalpa'
+ }, {
+ key: 'America/Winnipeg'
+ }, {
+ key: 'CST6CDT'
+ }, {
+ key: 'Etc/GMT+6'
+ }, {
+ key: 'Pacific/Easter'
+ }, {
+ key: 'Pacific/Galapagos'
+ }, {
+ key: 'America/Boise'
+ }, {
+ key: 'America/Cambridge_Bay'
+ }, {
+ key: 'America/Chihuahua'
+ }, {
+ key: 'America/Creston'
+ }, {
+ key: 'America/Dawson_Creek'
+ }, {
+ key: 'America/Denver'
+ }, {
+ key: 'America/Edmonton'
+ }, {
+ key: 'America/Fort_Nelson'
+ }, {
+ key: 'America/Hermosillo'
+ }, {
+ key: 'America/Inuvik'
+ }, {
+ key: 'America/Mazatlan'
+ }, {
+ key: 'America/Ojinaga'
+ }, {
+ key: 'America/Phoenix'
+ }, {
+ key: 'America/Yellowknife'
+ }, {
+ key: 'Etc/GMT+7'
+ }, {
+ key: 'MST'
+ }, {
+ key: 'MST7MDT'
+ }, {
+ key: 'America/Dawson'
+ }, {
+ key: 'America/Los_Angeles'
+ }, {
+ key: 'America/Tijuana'
+ }, {
+ key: 'America/Vancouver'
+ }, {
+ key: 'America/Whitehorse'
+ }, {
+ key: 'Etc/GMT+8'
+ }, {
+ key: 'Pacific/Pitcairn'
+ }, {
+ key: 'PST8PDT'
+ }, {
+ key: 'America/Anchorage'
+ }, {
+ key: 'America/Juneau'
+ }, {
+ key: 'America/Metlakatla'
+ }, {
+ key: 'America/Nome'
+ }, {
+ key: 'America/Sitka'
+ }, {
+ key: 'America/Yakutat'
+ }, {
+ key: 'Etc/GMT+9'
+ }, {
+ key: 'Pacific/Gambier'
+ }, {
+ key: 'Pacific/Marquesas'
+ }, {
+ key: 'America/Adak'
+ }, {
+ key: 'Etc/GMT+10'
+ }, {
+ key: 'HST'
+ }, {
+ key: 'Pacific/Honolulu'
+ }, {
+ key: 'Pacific/Rarotonga'
+ }, {
+ key: 'Pacific/Tahiti'
+ }, {
+ key: 'Etc/GMT+11'
+ }, {
+ key: 'Pacific/Niue'
+ }, {
+ key: 'Pacific/Pago_Pago'
+ }, {
+ key: 'Etc/GMT+12'
+ }]
+});
diff --git a/legacy/web/app/store/AttributeValueTypes.js b/legacy/web/app/store/AttributeValueTypes.js
new file mode 100644
index 00000000..b80eba39
--- /dev/null
+++ b/legacy/web/app/store/AttributeValueTypes.js
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.AttributeValueTypes', {
+ extend: 'Ext.data.Store',
+ fields: ['id', 'name'],
+ proxy: 'memory',
+
+ data: [{
+ id: 'string',
+ name: Strings.sharedTypeString
+ }, {
+ id: 'number',
+ name: Strings.sharedTypeNumber
+ }, {
+ id: 'boolean',
+ name: Strings.sharedTypeBoolean
+ }]
+});
diff --git a/legacy/web/app/store/Attributes.js b/legacy/web/app/store/Attributes.js
new file mode 100644
index 00000000..388fa436
--- /dev/null
+++ b/legacy/web/app/store/Attributes.js
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Attributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Attribute',
+
+ sorters: [{
+ property: 'priority'
+ }]
+});
diff --git a/legacy/web/app/store/Calendars.js b/legacy/web/app/store/Calendars.js
new file mode 100644
index 00000000..fa8e5c66
--- /dev/null
+++ b/legacy/web/app/store/Calendars.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Calendars', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Calendar',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/calendars',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/CommandTypes.js b/legacy/web/app/store/CommandTypes.js
new file mode 100644
index 00000000..3b898f2e
--- /dev/null
+++ b/legacy/web/app/store/CommandTypes.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2016 Gabor Somogyi (gabor.g.somogyi@gmail.com)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.CommandTypes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownCommand',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/commands/types',
+ listeners: {
+ 'exception': function (proxy, response) {
+ Traccar.app.showError(response);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/Commands.js b/legacy/web/app/store/Commands.js
new file mode 100644
index 00000000..3e5b7604
--- /dev/null
+++ b/legacy/web/app/store/Commands.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Commands', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Command',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/commands',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/CommonDeviceAttributes.js b/legacy/web/app/store/CommonDeviceAttributes.js
new file mode 100644
index 00000000..e63daa6b
--- /dev/null
+++ b/legacy/web/app/store/CommonDeviceAttributes.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.CommonDeviceAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownAttribute',
+
+ data: [{
+ key: 'speedLimit',
+ name: Strings.attributeSpeedLimit,
+ valueType: 'number',
+ dataType: 'speed'
+ }, {
+ key: 'report.ignoreOdometer',
+ name: Strings.attributeReportIgnoreOdometer,
+ valueType: 'boolean'
+ }]
+});
diff --git a/legacy/web/app/store/CommonUserAttributes.js b/legacy/web/app/store/CommonUserAttributes.js
new file mode 100644
index 00000000..0619df22
--- /dev/null
+++ b/legacy/web/app/store/CommonUserAttributes.js
@@ -0,0 +1,90 @@
+/*
+ * 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
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.CommonUserAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownAttribute',
+
+ data: [{
+ key: 'web.liveRouteLength',
+ name: Strings.attributeWebLiveRouteLength,
+ valueType: 'number',
+ allowDecimals: false
+ }, {
+ key: 'web.selectZoom',
+ name: Strings.attributeWebSelectZoom,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: Traccar.Style.mapDefaultZoom,
+ maxValue: Traccar.Style.mapMaxZoom
+ }, {
+ key: 'web.maxZoom',
+ name: Strings.attributeWebMaxZoom,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: Traccar.Style.mapDefaultZoom,
+ maxValue: Traccar.Style.mapMaxZoom
+ }, {
+ key: 'ui.disableEvents',
+ name: Strings.attributeUiDisableEvents,
+ valueType: 'boolean'
+ }, {
+ key: 'ui.disableVehicleFeatures',
+ name: Strings.attributeUiDisableVehicleFeatures,
+ valueType: 'boolean'
+ }, {
+ key: 'ui.disableDrivers',
+ name: Strings.attributeUiDisableDrivers,
+ valueType: 'boolean'
+ }, {
+ key: 'ui.disableComputedAttributes',
+ name: Strings.attributeUiDisableComputedAttributes,
+ valueType: 'boolean'
+ }, {
+ key: 'ui.disableCalendars',
+ name: Strings.attributeUiDisableCalendars,
+ valueType: 'boolean'
+ }, {
+ key: 'ui.disableMaintenance',
+ name: Strings.attributeUiDisableMaintenance,
+ valueType: 'boolean'
+ }, {
+ key: 'ui.hidePositionAttributes',
+ name: Strings.attributeUiHidePositionAttributes,
+ valueType: 'string'
+ }, {
+ key: 'distanceUnit',
+ name: Strings.settingsDistanceUnit,
+ valueType: 'string',
+ dataType: 'distanceUnit'
+ }, {
+ key: 'speedUnit',
+ name: Strings.settingsSpeedUnit,
+ valueType: 'string',
+ dataType: 'speedUnit'
+ }, {
+ key: 'volumeUnit',
+ name: Strings.settingsVolumeUnit,
+ valueType: 'string',
+ dataType: 'volumeUnit'
+ }, {
+ key: 'timezone',
+ name: Strings.sharedTimezone,
+ valueType: 'string',
+ dataType: 'timezone'
+ }]
+});
diff --git a/legacy/web/app/store/ComputedAttributes.js b/legacy/web/app/store/ComputedAttributes.js
new file mode 100644
index 00000000..33d78298
--- /dev/null
+++ b/legacy/web/app/store/ComputedAttributes.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ComputedAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.ComputedAttribute',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/attributes/computed',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/CoordinateFormats.js b/legacy/web/app/store/CoordinateFormats.js
new file mode 100644
index 00000000..d5db871a
--- /dev/null
+++ b/legacy/web/app/store/CoordinateFormats.js
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.CoordinateFormats', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name'],
+
+ data: [{
+ key: 'dd',
+ name: Strings.sharedDecimalDegrees
+ }, {
+ key: 'ddm',
+ name: Strings.sharedDegreesDecimalMinutes
+ }, {
+ key: 'dms',
+ name: Strings.sharedDegreesMinutesSeconds
+ }],
+
+ formatValue: function (key, value, unit) {
+ var hemisphere, degrees, minutes, seconds;
+ if (key === 'latitude') {
+ hemisphere = value >= 0 ? 'N' : 'S';
+ } else {
+ hemisphere = value >= 0 ? 'E' : 'W';
+ }
+ switch (unit) {
+ case 'ddm':
+ value = Math.abs(value);
+ degrees = Math.floor(value);
+ minutes = (value - degrees) * 60;
+ return degrees + '° ' + minutes.toFixed(Traccar.Style.coordinatePrecision) + '\' ' + hemisphere;
+ case 'dms':
+ value = Math.abs(value);
+ degrees = Math.floor(value);
+ minutes = Math.floor((value - degrees) * 60);
+ seconds = Math.round((value - degrees - minutes / 60) * 3600);
+ return degrees + '° ' + minutes + '\' ' + seconds + '" ' + hemisphere;
+ default:
+ return value.toFixed(Traccar.Style.coordinatePrecision) + '°';
+ }
+ }
+});
diff --git a/legacy/web/app/store/DeviceAttributes.js b/legacy/web/app/store/DeviceAttributes.js
new file mode 100644
index 00000000..45ae6e3d
--- /dev/null
+++ b/legacy/web/app/store/DeviceAttributes.js
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.DeviceAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownAttribute',
+
+ data: [{
+ key: 'web.reportColor',
+ name: Strings.attributeWebReportColor,
+ valueType: 'color'
+ }, {
+ key: 'devicePassword',
+ name: Strings.attributeDevicePassword,
+ valueType: 'string'
+ }, {
+ key: 'processing.copyAttributes',
+ name: Strings.attributeProcessingCopyAttributes,
+ valueType: 'string'
+ }, {
+ key: 'decoder.timezone',
+ name: Strings.sharedTimezone,
+ valueType: 'string',
+ dataType: 'timezone'
+ }, {
+ key: 'deviceInactivityStart',
+ name: Strings.attributeDeviceInactivityStart,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: 1
+ }, {
+ key: 'deviceInactivityPeriod',
+ name: Strings.attributeDeviceInactivityPeriod,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: 1
+ }]
+});
diff --git a/legacy/web/app/store/DeviceCommands.js b/legacy/web/app/store/DeviceCommands.js
new file mode 100644
index 00000000..7233b3ba
--- /dev/null
+++ b/legacy/web/app/store/DeviceCommands.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.DeviceCommands', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Command',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/commands/send',
+ listeners: {
+ 'exception': function (proxy, response) {
+ Traccar.app.showError(response);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/DeviceImages.js b/legacy/web/app/store/DeviceImages.js
new file mode 100644
index 00000000..6f8e8cfd
--- /dev/null
+++ b/legacy/web/app/store/DeviceImages.js
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.DeviceImages', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name', 'svg', 'fillId', 'rotateId', 'scaleId'],
+
+ data: (function () {
+ var i, key, data = [];
+ for (i = 0; i < window.Images.length; i++) {
+ key = window.Images[i];
+ data.push({
+ key: key,
+ name: Strings['category' + key.charAt(0).toUpperCase() + key.slice(1)],
+ svg: document.getElementById(key + 'Svg').contentDocument,
+ fillId: key === 'arrow' ? 'arrow' : 'background',
+ rotateId: key === 'arrow' ? 'arrow' : 'background',
+ scaleId: key === 'arrow' ? 'arrow' : 'layer1'
+ });
+ }
+ return data;
+ })()
+});
diff --git a/legacy/web/app/store/DeviceStatuses.js b/legacy/web/app/store/DeviceStatuses.js
new file mode 100644
index 00000000..eafba241
--- /dev/null
+++ b/legacy/web/app/store/DeviceStatuses.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.DeviceStatuses', {
+ extend: 'Ext.data.Store',
+ fields: ['id', 'name', 'color'],
+
+ data: [{
+ id: 'online',
+ name: Strings.deviceStatusOnline,
+ color: 'view-color-green'
+ }, {
+ id: 'offline',
+ name: Strings.deviceStatusOffline,
+ color: 'view-color-red'
+ }, {
+ id: 'unknown',
+ name: Strings.deviceStatusUnknown,
+ color: 'view-color-yellow'
+ }]
+});
diff --git a/legacy/web/app/store/Devices.js b/legacy/web/app/store/Devices.js
new file mode 100644
index 00000000..e69c93fa
--- /dev/null
+++ b/legacy/web/app/store/Devices.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Devices', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Device',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/devices',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/DistanceUnits.js b/legacy/web/app/store/DistanceUnits.js
new file mode 100644
index 00000000..e64ce234
--- /dev/null
+++ b/legacy/web/app/store/DistanceUnits.js
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2015 - 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.DistanceUnits', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name', 'factor'],
+
+ data: [{
+ key: 'km',
+ name: Strings.sharedKm,
+ factor: 0.001
+ }, {
+ key: 'mi',
+ name: Strings.sharedMi,
+ factor: 0.000621371
+ }, {
+ key: 'nmi',
+ name: Strings.sharedNmi,
+ factor: 0.000539957
+ }],
+
+ convertValue: function (value, unit, back) {
+ var model;
+ if (!unit) {
+ unit = 'km';
+ }
+ model = this.findRecord('key', unit);
+ return back ? value / model.get('factor') : value * model.get('factor');
+ },
+
+ formatValue: function (value, unit, convert) {
+ var model;
+ if (!unit) {
+ unit = 'km';
+ }
+ model = this.findRecord('key', unit);
+ return (convert ? this.convertValue(value, unit) : value).toFixed(2) + ' ' + model.get('name');
+ }
+});
diff --git a/legacy/web/app/store/Drivers.js b/legacy/web/app/store/Drivers.js
new file mode 100644
index 00000000..fd4ca203
--- /dev/null
+++ b/legacy/web/app/store/Drivers.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Drivers', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Driver',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/drivers',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/EventPositions.js b/legacy/web/app/store/EventPositions.js
new file mode 100644
index 00000000..d984e4b8
--- /dev/null
+++ b/legacy/web/app/store/EventPositions.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.EventPositions', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Position',
+
+ trackRemoved: false,
+
+ proxy: {
+ type: 'rest',
+ url: 'api/positions',
+ headers: {
+ 'Accept': 'application/json'
+ }
+ }
+});
diff --git a/legacy/web/app/store/Events.js b/legacy/web/app/store/Events.js
new file mode 100644
index 00000000..cfa0d568
--- /dev/null
+++ b/legacy/web/app/store/Events.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Events', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Event',
+
+ trackRemoved: false,
+
+ proxy: {
+ type: 'rest',
+ url: 'api/events'
+ }
+});
diff --git a/legacy/web/app/store/GeofenceAttributes.js b/legacy/web/app/store/GeofenceAttributes.js
new file mode 100644
index 00000000..b1d48c19
--- /dev/null
+++ b/legacy/web/app/store/GeofenceAttributes.js
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.GeofenceAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownAttribute',
+ proxy: 'memory',
+
+ data: [{
+ key: 'color',
+ name: Strings.attributeColor,
+ valueType: 'color'
+ }, {
+ key: 'speedLimit',
+ name: Strings.attributeSpeedLimit,
+ valueType: 'number',
+ dataType: 'speed'
+ }, {
+ key: 'polylineDistance',
+ name: Strings.attributePolylineDistance,
+ valueType: 'number',
+ dataType: 'distance'
+ }]
+});
diff --git a/legacy/web/app/store/GeofenceTypes.js b/legacy/web/app/store/GeofenceTypes.js
new file mode 100644
index 00000000..45b79897
--- /dev/null
+++ b/legacy/web/app/store/GeofenceTypes.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.GeofenceTypes', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name'],
+
+ data: [{
+ key: 'Polygon',
+ name: Strings.mapShapePolygon
+ }, {
+ key: 'Circle',
+ name: Strings.mapShapeCircle
+ }, {
+ key: 'LineString',
+ name: Strings.mapShapePolyline
+ }]
+});
diff --git a/legacy/web/app/store/Geofences.js b/legacy/web/app/store/Geofences.js
new file mode 100644
index 00000000..5a7172be
--- /dev/null
+++ b/legacy/web/app/store/Geofences.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Geofences', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Geofence',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/geofences',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/GroupAttributes.js b/legacy/web/app/store/GroupAttributes.js
new file mode 100644
index 00000000..589e4ec2
--- /dev/null
+++ b/legacy/web/app/store/GroupAttributes.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.GroupAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownAttribute',
+
+ data: [{
+ key: 'processing.copyAttributes',
+ name: Strings.attributeProcessingCopyAttributes,
+ valueType: 'string'
+ }, {
+ key: 'decoder.timezone',
+ name: Strings.sharedTimezone,
+ valueType: 'string',
+ dataType: 'timezone'
+ }]
+});
diff --git a/legacy/web/app/store/Groups.js b/legacy/web/app/store/Groups.js
new file mode 100644
index 00000000..5f8fa60a
--- /dev/null
+++ b/legacy/web/app/store/Groups.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Groups', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Group',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/groups',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/HoursUnits.js b/legacy/web/app/store/HoursUnits.js
new file mode 100644
index 00000000..02f62c65
--- /dev/null
+++ b/legacy/web/app/store/HoursUnits.js
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.HoursUnits', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name', 'fullName'],
+
+ data: [{
+ key: 'h',
+ name: Strings.sharedHourAbbreviation,
+ fullName: Strings.sharedHour
+ }],
+
+ convertValue: function (value, unit, back) {
+ return back ? value * 3600000 : value / 3600000;
+ },
+
+ formatValue: function (value, unit, convert) {
+ var hours, minutes;
+ if (convert) {
+ hours = Math.floor(value / 3600000);
+ minutes = Math.floor(value % 3600000 / 60000);
+ } else {
+ hours = Math.floor(value);
+ minutes = Math.floor(value % 1 * 60);
+ }
+ return hours + ' ' + Strings.sharedHourAbbreviation + ' ' + minutes + ' ' + Strings.sharedMinuteAbbreviation;
+ }
+});
diff --git a/legacy/web/app/store/KnownCommands.js b/legacy/web/app/store/KnownCommands.js
new file mode 100644
index 00000000..a6089c48
--- /dev/null
+++ b/legacy/web/app/store/KnownCommands.js
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.KnownCommands', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownCommand',
+
+ data: [{
+ type: 'custom',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'positionPeriodic',
+ parameters: [{
+ key: 'frequency',
+ name: Strings.commandFrequency,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: 0,
+ dataType: 'frequency'
+ }]
+ }, {
+ type: 'setTimezone',
+ parameters: [{
+ key: 'timezone',
+ name: Strings.commandTimezone,
+ valueType: 'string',
+ dataType: 'timezone'
+ }]
+ }, {
+ type: 'sendSms',
+ parameters: [{
+ key: 'phone',
+ name: Strings.commandPhone,
+ valueType: 'string'
+ }, {
+ key: 'message',
+ name: Strings.commandMessage,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'message',
+ parameters: [{
+ key: 'message',
+ name: Strings.commandMessage,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'sendUssd',
+ parameters: [{
+ key: 'phone',
+ name: Strings.commandPhone,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'sosNumber',
+ parameters: [{
+ key: 'index',
+ name: Strings.commandIndex,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: 0
+ }, {
+ key: 'phone',
+ name: Strings.commandPhone,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'silenceTime',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'setPhonebook',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'voiceMessage',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'outputControl',
+ parameters: [{
+ key: 'index',
+ name: Strings.commandIndex,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: 0
+ }, {
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'voiceMonitoring',
+ parameters: [{
+ key: 'enable',
+ name: Strings.commandEnable,
+ valueType: 'boolean'
+ }]
+ }, {
+ type: 'setAgps',
+ parameters: [{
+ key: 'enable',
+ name: Strings.commandEnable,
+ valueType: 'boolean'
+ }]
+ }, {
+ type: 'setIndicator',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'configuration',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'setConnection',
+ parameters: [{
+ key: 'server',
+ name: Strings.commandServer,
+ valueType: 'string'
+ }, {
+ key: 'port',
+ name: Strings.commandPort,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: 1,
+ maxValue: 65535
+ }]
+ }, {
+ type: 'setOdometer',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'modePowerSaving',
+ parameters: [{
+ key: 'enable',
+ name: Strings.commandEnable,
+ valueType: 'boolean'
+ }]
+ }, {
+ type: 'modeDeepSleep',
+ parameters: [{
+ key: 'enable',
+ name: Strings.commandEnable,
+ valueType: 'boolean'
+ }]
+ }, {
+ type: 'alarmGeofence',
+ parameters: [{
+ key: 'radius',
+ name: Strings.commandRadius,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: 0
+ }]
+ }, {
+ type: 'alarmBattery',
+ parameters: [{
+ key: 'enable',
+ name: Strings.commandEnable,
+ valueType: 'boolean'
+ }]
+ }, {
+ type: 'alarmSos',
+ parameters: [{
+ key: 'enable',
+ name: Strings.commandEnable,
+ valueType: 'boolean'
+ }]
+ }, {
+ type: 'alarmRemove',
+ parameters: [{
+ key: 'enable',
+ name: Strings.commandEnable,
+ valueType: 'boolean'
+ }]
+ }, {
+ type: 'alarmClock',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'alarmSpeed',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }, {
+ type: 'alarmFall',
+ parameters: [{
+ key: 'enable',
+ name: Strings.commandEnable,
+ valueType: 'boolean'
+ }]
+ }, {
+ type: 'alarmVibration',
+ parameters: [{
+ key: 'data',
+ name: Strings.commandData,
+ valueType: 'string'
+ }]
+ }]
+});
diff --git a/legacy/web/app/store/Languages.js b/legacy/web/app/store/Languages.js
new file mode 100644
index 00000000..32d648e0
--- /dev/null
+++ b/legacy/web/app/store/Languages.js
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Languages', {
+ extend: 'Ext.data.Store',
+ fields: ['code', 'name'],
+
+ data: (function () {
+ var code, data = [];
+ for (code in Locale.languages) {
+ if (Locale.languages.hasOwnProperty(code)) {
+ data.push({
+ code: code,
+ name: Locale.languages[code].name
+ });
+ }
+ }
+ return data;
+ })()
+});
diff --git a/legacy/web/app/store/LatestPositions.js b/legacy/web/app/store/LatestPositions.js
new file mode 100644
index 00000000..f7cf5406
--- /dev/null
+++ b/legacy/web/app/store/LatestPositions.js
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.LatestPositions', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Position'
+});
diff --git a/legacy/web/app/store/MaintenanceTypes.js b/legacy/web/app/store/MaintenanceTypes.js
new file mode 100644
index 00000000..468b67ea
--- /dev/null
+++ b/legacy/web/app/store/MaintenanceTypes.js
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.MaintenanceTypes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownAttribute'
+});
diff --git a/legacy/web/app/store/Maintenances.js b/legacy/web/app/store/Maintenances.js
new file mode 100644
index 00000000..a7aa4a07
--- /dev/null
+++ b/legacy/web/app/store/Maintenances.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Maintenances', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Maintenance',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/maintenance',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/MapTypes.js b/legacy/web/app/store/MapTypes.js
new file mode 100644
index 00000000..f517045d
--- /dev/null
+++ b/legacy/web/app/store/MapTypes.js
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.MapTypes', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name'],
+
+ data: [{
+ key: 'locationIqStreets',
+ name: Strings.mapLocationIqStreets
+ }, {
+ key: 'osm',
+ name: Strings.mapOsm
+ }, {
+ key: 'carto',
+ name: Strings.mapCarto
+ }, {
+ key: 'autoNavi',
+ name: Strings.mapAutoNavi
+ }, {
+ key: 'bingRoad',
+ name: Strings.mapBingRoad
+ }, {
+ key: 'bingAerial',
+ name: Strings.mapBingAerial
+ }, {
+ key: 'bingHybrid',
+ name: Strings.mapBingHybrid
+ }, {
+ key: 'yandexMap',
+ name: Strings.mapYandexMap
+ }, {
+ key: 'yandexSat',
+ name: Strings.mapYandexSat
+ }, {
+ key: 'custom',
+ name: Strings.mapCustom
+ }, {
+ key: 'customArcgis',
+ name: Strings.mapCustomArcgis
+ }]
+});
diff --git a/legacy/web/app/store/Notifications.js b/legacy/web/app/store/Notifications.js
new file mode 100644
index 00000000..b30505fd
--- /dev/null
+++ b/legacy/web/app/store/Notifications.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Notifications', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Notification',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/notifications',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/PositionAttributes.js b/legacy/web/app/store/PositionAttributes.js
new file mode 100644
index 00000000..5b1206b7
--- /dev/null
+++ b/legacy/web/app/store/PositionAttributes.js
@@ -0,0 +1,269 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.PositionAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownAttribute',
+ proxy: 'memory',
+
+ data: [{
+ key: 'raw',
+ name: Strings.positionRaw,
+ valueType: 'string'
+ }, {
+ key: 'index',
+ name: Strings.positionIndex,
+ valueType: 'number'
+ }, {
+ key: 'hdop',
+ name: Strings.positionHdop,
+ valueType: 'number'
+ }, {
+ key: 'vdop',
+ name: Strings.positionVdop,
+ valueType: 'number'
+ }, {
+ key: 'pdop',
+ name: Strings.positionPdop,
+ valueType: 'number'
+ }, {
+ key: 'sat',
+ name: Strings.positionSat,
+ valueType: 'number'
+ }, {
+ key: 'satVisible',
+ name: Strings.positionSatVisible,
+ valueType: 'number'
+ }, {
+ key: 'rssi',
+ name: Strings.positionRssi,
+ valueType: 'number'
+ }, {
+ key: 'gps',
+ name: Strings.positionGps,
+ valueType: 'number'
+ }, {
+ key: 'roaming',
+ name: Strings.positionRoaming,
+ valueType: 'boolean'
+ }, {
+ key: 'event',
+ name: Strings.positionEvent,
+ valueType: 'string'
+ }, {
+ key: 'alarm',
+ name: Strings.positionAlarm,
+ valueType: 'string'
+ }, {
+ key: 'status',
+ name: Strings.positionStatus,
+ valueType: 'string'
+ }, {
+ key: 'odometer',
+ name: Strings.positionOdometer,
+ valueType: 'number',
+ dataType: 'distance'
+ }, {
+ key: 'serviceOdometer',
+ name: Strings.positionServiceOdometer,
+ valueType: 'number',
+ dataType: 'distance'
+ }, {
+ key: 'tripOdometer',
+ name: Strings.positionTripOdometer,
+ valueType: 'number',
+ dataType: 'distance'
+ }, {
+ key: 'hours',
+ name: Strings.positionHours,
+ valueType: 'number',
+ dataType: 'hours'
+ }, {
+ key: 'steps',
+ name: Strings.positionSteps,
+ valueType: 'number'
+ }, {
+ key: 'input',
+ name: Strings.positionInput,
+ valueType: 'string'
+ }, {
+ key: 'output',
+ name: Strings.positionOutput,
+ valueType: 'string'
+ }, {
+ key: 'power',
+ name: Strings.positionPower,
+ valueType: 'number',
+ dataType: 'voltage'
+ }, {
+ key: 'battery',
+ name: Strings.positionBattery,
+ valueType: 'number',
+ dataType: 'voltage'
+ }, {
+ key: 'batteryLevel',
+ name: Strings.positionBatteryLevel,
+ valueType: 'number',
+ dataType: 'percentage'
+ }, {
+ key: 'fuel',
+ name: Strings.positionFuel,
+ valueType: 'number',
+ dataType: 'volume'
+ }, {
+ key: 'fuelConsumption',
+ name: Strings.positionFuelConsumption,
+ valueType: 'number',
+ dataType: 'consumption'
+ }, {
+ key: 'versionFw',
+ name: Strings.positionVersionFw,
+ valueType: 'string'
+ }, {
+ key: 'versionHw',
+ name: Strings.positionVersionHw,
+ valueType: 'string'
+ }, {
+ key: 'type',
+ name: Strings.sharedType,
+ valueType: 'string'
+ }, {
+ key: 'ignition',
+ name: Strings.positionIgnition,
+ valueType: 'boolean'
+ }, {
+ key: 'flags',
+ name: Strings.positionFlags,
+ valueType: 'string'
+ }, {
+ key: 'charge',
+ name: Strings.positionCharge,
+ valueType: 'boolean'
+ }, {
+ key: 'ip',
+ name: Strings.positionIp,
+ valueType: 'string'
+ }, {
+ key: 'archive',
+ name: Strings.positionArchive,
+ valueType: 'boolean'
+ }, {
+ key: 'distance',
+ name: Strings.positionDistance,
+ valueType: 'number',
+ dataType: 'distance'
+ }, {
+ key: 'totalDistance',
+ name: Strings.deviceTotalDistance,
+ valueType: 'number',
+ dataType: 'distance'
+ }, {
+ key: 'rpm',
+ name: Strings.positionRpm,
+ valueType: 'number'
+ }, {
+ key: 'vin',
+ name: Strings.positionVin,
+ valueType: 'string'
+ }, {
+ key: 'approximate',
+ name: Strings.positionApproximate,
+ valueType: 'boolean'
+ }, {
+ key: 'throttle',
+ name: Strings.positionThrottle,
+ valueType: 'number'
+ }, {
+ key: 'motion',
+ name: Strings.positionMotion,
+ valueType: 'boolean'
+ }, {
+ key: 'armed',
+ name: Strings.positionArmed,
+ valueType: 'number'
+ }, {
+ key: 'geofence',
+ name: Strings.sharedGeofence,
+ valueType: 'string'
+ }, {
+ key: 'acceleration',
+ name: Strings.positionAcceleration,
+ valueType: 'number'
+ }, {
+ key: 'deviceTemp',
+ name: Strings.positionDeviceTemp,
+ valueType: 'number',
+ dataType: 'temperature'
+ }, {
+ key: 'operator',
+ name: Strings.positionOperator,
+ valueType: 'string'
+ }, {
+ key: 'command',
+ name: Strings.deviceCommand,
+ valueType: 'string'
+ }, {
+ key: 'blocked',
+ name: Strings.positionBlocked,
+ valueType: 'boolean'
+ }, {
+ key: 'dtcs',
+ name: Strings.positionDtcs,
+ valueType: 'string'
+ }, {
+ key: 'obdSpeed',
+ name: Strings.positionObdSpeed,
+ valueType: 'number',
+ dataType: 'speed'
+ }, {
+ key: 'obdOdometer',
+ name: Strings.positionObdOdometer,
+ valueType: 'number',
+ dataType: 'distance'
+ }, {
+ key: 'result',
+ name: Strings.eventCommandResult,
+ valueType: 'string'
+ }, {
+ key: 'driverUniqueId',
+ name: Strings.positionDriverUniqueId,
+ valueType: 'string',
+ dataType: 'driverUniqueId'
+ }],
+
+ getAttributeName: function (key, capitalize) {
+ var model = this.getById(key);
+ if (model) {
+ return model.get('name');
+ } else if (capitalize) {
+ return key.replace(/^./, function (match) {
+ return match.toUpperCase();
+ });
+ } else {
+ return key;
+ }
+ },
+
+ getAttributeDataType: function (key) {
+ var model = this.getById(key);
+ if (model && model.get('dataType')) {
+ return model.get('dataType');
+ } else {
+ return null;
+ }
+ }
+});
diff --git a/legacy/web/app/store/Positions.js b/legacy/web/app/store/Positions.js
new file mode 100644
index 00000000..388a3320
--- /dev/null
+++ b/legacy/web/app/store/Positions.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Positions', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Position',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/positions',
+ headers: {
+ 'Accept': 'application/json'
+ }
+ }
+});
diff --git a/legacy/web/app/store/ReportChartTypes.js b/legacy/web/app/store/ReportChartTypes.js
new file mode 100644
index 00000000..f53d3197
--- /dev/null
+++ b/legacy/web/app/store/ReportChartTypes.js
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ReportChartTypes', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name'],
+
+ data: [{
+ key: 'speed',
+ name: Strings.positionSpeed
+ }, {
+ key: 'accuracy',
+ name: Strings.positionAccuracy
+ }, {
+ key: 'altitude',
+ name: Strings.positionAltitude
+ }]
+});
diff --git a/legacy/web/app/store/ReportEventTypes.js b/legacy/web/app/store/ReportEventTypes.js
new file mode 100644
index 00000000..001f159b
--- /dev/null
+++ b/legacy/web/app/store/ReportEventTypes.js
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2015 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ReportEventTypes', {
+ extend: 'Ext.data.Store',
+ fields: ['type', 'name'],
+
+ statics: {
+ allEvents: 'allEvents'
+ }
+});
diff --git a/legacy/web/app/store/ReportEvents.js b/legacy/web/app/store/ReportEvents.js
new file mode 100644
index 00000000..061aaa42
--- /dev/null
+++ b/legacy/web/app/store/ReportEvents.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ReportEvents', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Event',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/reports/events',
+ timeout: Traccar.Style.reportTimeout,
+ headers: {
+ 'Accept': 'application/json'
+ },
+ listeners: {
+ exception: function (proxy, exception) {
+ Traccar.app.showError(exception);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/ReportPeriods.js b/legacy/web/app/store/ReportPeriods.js
new file mode 100644
index 00000000..542fdce9
--- /dev/null
+++ b/legacy/web/app/store/ReportPeriods.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ReportPeriods', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name'],
+
+ data: [{
+ key: 'custom',
+ name: Strings.reportCustom
+ }, {
+ key: 'today',
+ name: Strings.reportToday
+ }, {
+ key: 'yesterday',
+ name: Strings.reportYesterday
+ }, {
+ key: 'thisWeek',
+ name: Strings.reportThisWeek
+ }, {
+ key: 'previousWeek',
+ name: Strings.reportPreviousWeek
+ }, {
+ key: 'thisMonth',
+ name: Strings.reportThisMonth
+ }, {
+ key: 'previousMonth',
+ name: Strings.reportPreviousMonth
+ }]
+});
diff --git a/legacy/web/app/store/ReportRoute.js b/legacy/web/app/store/ReportRoute.js
new file mode 100644
index 00000000..7babe163
--- /dev/null
+++ b/legacy/web/app/store/ReportRoute.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ReportRoute', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Position',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/reports/route',
+ timeout: Traccar.Style.reportTimeout,
+ headers: {
+ 'Accept': 'application/json'
+ },
+ listeners: {
+ exception: function (proxy, exception) {
+ Traccar.app.showError(exception);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/ReportStops.js b/legacy/web/app/store/ReportStops.js
new file mode 100644
index 00000000..75c9fc18
--- /dev/null
+++ b/legacy/web/app/store/ReportStops.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ReportStops', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.ReportStop',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/reports/stops',
+ timeout: Traccar.Style.reportTimeout,
+ headers: {
+ 'Accept': 'application/json'
+ },
+ listeners: {
+ exception: function (proxy, exception) {
+ Traccar.app.showError(exception);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/ReportSummary.js b/legacy/web/app/store/ReportSummary.js
new file mode 100644
index 00000000..f328da2d
--- /dev/null
+++ b/legacy/web/app/store/ReportSummary.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ReportSummary', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.ReportSummary',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/reports/summary',
+ timeout: Traccar.Style.reportTimeout,
+ headers: {
+ 'Accept': 'application/json'
+ },
+ listeners: {
+ exception: function (proxy, exception) {
+ Traccar.app.showError(exception);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/ReportTrips.js b/legacy/web/app/store/ReportTrips.js
new file mode 100644
index 00000000..057cc7c0
--- /dev/null
+++ b/legacy/web/app/store/ReportTrips.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ReportTrips', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.ReportTrip',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/reports/trips',
+ timeout: Traccar.Style.reportTimeout,
+ headers: {
+ 'Accept': 'application/json'
+ },
+ listeners: {
+ exception: function (proxy, exception) {
+ Traccar.app.showError(exception);
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/store/ReportTypes.js b/legacy/web/app/store/ReportTypes.js
new file mode 100644
index 00000000..ceaba9d2
--- /dev/null
+++ b/legacy/web/app/store/ReportTypes.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.ReportTypes', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name'],
+
+ data: [{
+ key: 'route',
+ name: Strings.reportRoute
+ }, {
+ key: 'events',
+ name: Strings.reportEvents
+ }, {
+ key: 'trips',
+ name: Strings.reportTrips
+ }, {
+ key: 'stops',
+ name: Strings.reportStops
+ }, {
+ key: 'summary',
+ name: Strings.reportSummary
+ }, {
+ key: 'daily',
+ name: Strings.reportDaily
+ }, {
+ key: 'chart',
+ name: Strings.reportChart
+ }]
+});
diff --git a/legacy/web/app/store/ServerAttributes.js b/legacy/web/app/store/ServerAttributes.js
new file mode 100644
index 00000000..204f885b
--- /dev/null
+++ b/legacy/web/app/store/ServerAttributes.js
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.ServerAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownAttribute',
+
+ data: []
+});
diff --git a/legacy/web/app/store/SpeedUnits.js b/legacy/web/app/store/SpeedUnits.js
new file mode 100644
index 00000000..a36be928
--- /dev/null
+++ b/legacy/web/app/store/SpeedUnits.js
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2015 - 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.SpeedUnits', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name', 'factor'],
+
+ data: [{
+ key: 'kn',
+ name: Strings.sharedKn,
+ factor: 1
+ }, {
+ key: 'kmh',
+ name: Strings.sharedKmh,
+ factor: 1.852
+ }, {
+ key: 'mph',
+ name: Strings.sharedMph,
+ factor: 1.15078
+ }],
+
+ convertValue: function (value, unit, back) {
+ var model;
+ if (!unit) {
+ unit = 'kn';
+ }
+ model = this.findRecord('key', unit);
+ return back ? value / model.get('factor') : value * model.get('factor');
+ },
+
+ formatValue: function (value, unit, convert) {
+ var model;
+ if (!unit) {
+ unit = 'kn';
+ }
+ model = this.findRecord('key', unit);
+ return (convert ? this.convertValue(value, unit) : value).toFixed(1) + ' ' + model.get('name');
+ }
+});
diff --git a/legacy/web/app/store/Statistics.js b/legacy/web/app/store/Statistics.js
new file mode 100644
index 00000000..1d44c6e3
--- /dev/null
+++ b/legacy/web/app/store/Statistics.js
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Statistics', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.Statistics',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/statistics'
+ }
+});
diff --git a/legacy/web/app/store/TimeUnits.js b/legacy/web/app/store/TimeUnits.js
new file mode 100644
index 00000000..0d16c4bb
--- /dev/null
+++ b/legacy/web/app/store/TimeUnits.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.TimeUnits', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name', 'factor'],
+
+ data: [{
+ key: 's',
+ name: Strings.sharedSecondAbbreviation,
+ factor: 1
+ }, {
+ key: 'm',
+ name: Strings.sharedMinuteAbbreviation,
+ factor: 60
+ }, {
+ key: 'h',
+ name: Strings.sharedHourAbbreviation,
+ factor: 3600
+ }],
+
+ convertValue: function (value, unit, back) {
+ var model;
+ if (!unit) {
+ unit = 'kn';
+ }
+ model = this.findRecord('key', unit);
+ return back ? value * model.get('factor') : value / model.get('factor');
+ }
+});
diff --git a/legacy/web/app/store/UserAttributes.js b/legacy/web/app/store/UserAttributes.js
new file mode 100644
index 00000000..dfe69421
--- /dev/null
+++ b/legacy/web/app/store/UserAttributes.js
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.store.UserAttributes', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.KnownAttribute',
+
+ data: [{
+ key: 'mail.smtp.host',
+ name: Strings.attributeMailSmtpHost,
+ valueType: 'string'
+ }, {
+ key: 'mail.smtp.port',
+ name: Strings.attributeMailSmtpPort,
+ valueType: 'number',
+ allowDecimals: false,
+ minValue: 1,
+ maxValue: 65535
+ }, {
+ key: 'mail.smtp.starttls.enable',
+ name: Strings.attributeMailSmtpStarttlsEnable,
+ valueType: 'boolean'
+ }, {
+ key: 'mail.smtp.starttls.required',
+ name: Strings.attributeMailSmtpStarttlsRequired,
+ valueType: 'boolean'
+ }, {
+ key: 'mail.smtp.ssl.enable',
+ name: Strings.attributeMailSmtpSslEnable,
+ valueType: 'boolean'
+ }, {
+ key: 'mail.smtp.ssl.trust',
+ name: Strings.attributeMailSmtpSslTrust,
+ valueType: 'string'
+ }, {
+ key: 'mail.smtp.ssl.protocols',
+ name: Strings.attributeMailSmtpSslProtocols,
+ valueType: 'string'
+ }, {
+ key: 'mail.smtp.from',
+ name: Strings.attributeMailSmtpFrom,
+ valueType: 'string'
+ }, {
+ key: 'mail.smtp.auth',
+ name: Strings.attributeMailSmtpAuth,
+ valueType: 'boolean'
+ }, {
+ key: 'mail.smtp.username',
+ name: Strings.attributeMailSmtpUsername,
+ valueType: 'string'
+ }, {
+ key: 'mail.smtp.password',
+ name: Strings.attributeMailSmtpPassword,
+ valueType: 'string'
+ }]
+});
diff --git a/legacy/web/app/store/Users.js b/legacy/web/app/store/Users.js
new file mode 100644
index 00000000..0279afea
--- /dev/null
+++ b/legacy/web/app/store/Users.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.Users', {
+ extend: 'Ext.data.Store',
+ model: 'Traccar.model.User',
+
+ proxy: {
+ type: 'rest',
+ url: 'api/users',
+ writer: {
+ writeAllFields: true
+ }
+ }
+});
diff --git a/legacy/web/app/store/VisibleDevices.js b/legacy/web/app/store/VisibleDevices.js
new file mode 100644
index 00000000..db1ca7da
--- /dev/null
+++ b/legacy/web/app/store/VisibleDevices.js
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.VisibleDevices', {
+ extend: 'Ext.data.ChainedStore',
+ source: 'Devices'
+});
diff --git a/legacy/web/app/store/VolumeUnits.js b/legacy/web/app/store/VolumeUnits.js
new file mode 100644
index 00000000..2bdf6684
--- /dev/null
+++ b/legacy/web/app/store/VolumeUnits.js
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.store.VolumeUnits', {
+ extend: 'Ext.data.Store',
+ fields: ['key', 'name', 'fullName', 'factor'],
+
+ data: [{
+ key: 'ltr',
+ name: Strings.sharedLiterAbbreviation,
+ fullName: Strings.sharedLiter,
+ factor: 1
+ }, {
+ key: 'impGal',
+ name: Strings.sharedGallonAbbreviation,
+ fullName: Strings.sharedImpGallon,
+ factor: 4.546
+ }, {
+ key: 'usGal',
+ name: Strings.sharedGallonAbbreviation,
+ fullName: Strings.sharedUsGallon,
+ factor: 3.785
+ }],
+
+ convertValue: function (value, unit, back) {
+ var model;
+ if (!unit) {
+ unit = 'ltr';
+ }
+ model = this.findRecord('key', unit);
+ return back ? value * model.get('factor') : value / model.get('factor');
+ },
+
+ formatValue: function (value, unit, convert) {
+ var model;
+ if (!unit) {
+ unit = 'ltr';
+ }
+ model = this.findRecord('key', unit);
+ return (convert ? this.convertValue(value, unit) : value).toFixed(1) + ' ' + model.get('name');
+ }
+});
diff --git a/legacy/web/app/view/ArrayListFilter.js b/legacy/web/app/view/ArrayListFilter.js
new file mode 100644
index 00000000..519096eb
--- /dev/null
+++ b/legacy/web/app/view/ArrayListFilter.js
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.ArrayListFilter', {
+ extend: 'Ext.grid.filters.filter.List',
+ alias: 'grid.filter.arraylist',
+
+ type: 'arraylist',
+
+ constructor: function (config) {
+ this.callParent([config]);
+ this.filter.setFilterFn(function (item) {
+ var i, property, value, splits;
+ property = item.get(this.getProperty());
+ value = this.getValue();
+ if (Ext.isArray(property)) {
+ for (i = 0; i < property.length; i++) {
+ if (value.indexOf(property[i]) !== -1) {
+ return true;
+ }
+ }
+ } else if (property.match(/[ ,]+/)) {
+ splits = property.split(/[ ,]+/).filter(Boolean);
+ for (i = 0; i < splits.length; i++) {
+ if (value.indexOf(splits[i]) !== -1) {
+ return true;
+ }
+ }
+ } else if (value.indexOf(property) !== -1) {
+ return true;
+ }
+ return false;
+ });
+ }
+});
diff --git a/legacy/web/app/view/BaseWindow.js b/legacy/web/app/view/BaseWindow.js
new file mode 100644
index 00000000..bf698e08
--- /dev/null
+++ b/legacy/web/app/view/BaseWindow.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2015 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.BaseWindow', {
+ extend: 'Ext.window.Window',
+
+ width: Traccar.Style.windowWidth,
+ height: Traccar.Style.windowHeight,
+ layout: 'fit',
+
+ initComponent: function () {
+ if (window.innerWidth < Traccar.Style.windowWidth || window.innerHeight < Traccar.Style.windowHeight) {
+ this.maximized = true;
+ this.style = 'border-width: 0';
+ }
+ this.callParent();
+ }
+});
diff --git a/legacy/web/app/view/ClearableComboBox.js b/legacy/web/app/view/ClearableComboBox.js
new file mode 100644
index 00000000..cf811d1d
--- /dev/null
+++ b/legacy/web/app/view/ClearableComboBox.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.ClearableComboBox', {
+ extend: 'Ext.form.field.ComboBox',
+ xtype: 'clearableComboBox',
+
+ editable: false,
+ triggers: {
+ clear: {
+ cls: 'iconCls: x-fa fa-times',
+ handler: function (button) {
+ button.clearValue();
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/view/ColorPicker.js b/legacy/web/app/view/ColorPicker.js
new file mode 100644
index 00000000..5de03aa3
--- /dev/null
+++ b/legacy/web/app/view/ColorPicker.js
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.ColorPicker', {
+ extend: 'Ext.form.field.Picker',
+ xtype: 'customcolorpicker',
+
+ config: {
+ value: '#008000'
+ },
+
+ editable: false,
+
+ createPicker: function () {
+ return Ext.create('Ext.picker.Color', {
+ floating: true,
+ picker: this,
+ select: function (selColor) {
+ this.picker.setValue('#' + selColor);
+ this.picker.collapse();
+ }
+ });
+ },
+
+ setValue: function (color) {
+ this.callParent([color]);
+ this.setFieldStyle('background-color:' + color);
+ }
+});
diff --git a/legacy/web/app/view/CustomNumberField.js b/legacy/web/app/view/CustomNumberField.js
new file mode 100644
index 00000000..8cfac1ee
--- /dev/null
+++ b/legacy/web/app/view/CustomNumberField.js
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.CustomNumberField', {
+ extend: 'Ext.form.field.Number',
+ xtype: 'customNumberField',
+
+ beforeEl: '<div style="width:100%;display:inline-table;">',
+ unitEl: '<div id="numberUnitEl" style="display:table-cell;padding-left:10px;vertical-align:middle;width:1px;white-space:nowrap;">',
+
+ constructor: function (config) {
+ var unitName = '';
+ if (config.dataType) {
+ config.beforeBodyEl = this.beforeEl;
+ switch (config.dataType) {
+ case 'speed':
+ config.units = {};
+ config.units.getStore = function () {
+ return Ext.getStore('SpeedUnits');
+ };
+ config.units.getValue = function () {
+ return Traccar.app.getAttributePreference('speedUnit', 'kn');
+ };
+ unitName = Ext.getStore('SpeedUnits').findRecord('key', config.units.getValue()).get('name');
+ break;
+ case 'distance':
+ config.units = {};
+ config.units.getStore = function () {
+ return Ext.getStore('DistanceUnits');
+ };
+ config.units.getValue = function () {
+ return Traccar.app.getAttributePreference('distanceUnit', 'km');
+ };
+ unitName = Ext.getStore('DistanceUnits').findRecord('key', config.units.getValue()).get('name');
+ break;
+ case 'frequency':
+ if (!config.listeners) {
+ config.listeners = {};
+ }
+ config.listeners.afterrender = function () {
+ if (!this.units) {
+ this.units = Ext.create({
+ xtype: 'combobox',
+ renderTo: 'numberUnitEl',
+ store: 'TimeUnits',
+ displayField: 'name',
+ valueField: 'key',
+ editable: false,
+ numberField: this,
+ value: 's',
+ width: '70px',
+ listeners: {
+ select: function () {
+ this.numberField.step = this.getStore().convertValue(1, this.getValue(), true);
+ }
+ }
+ });
+ }
+ };
+ break;
+ case 'hours':
+ config.units = {};
+ config.units.getStore = function () {
+ return Ext.getStore('HoursUnits');
+ };
+ config.units.getValue = function () {
+ return 'h';
+ };
+ unitName = Strings.sharedHourAbbreviation;
+ break;
+ default:
+ break;
+ }
+ config.afterBodyEl = this.unitEl + unitName + '</div></div>';
+ config.rawToValue = function (rawValue) {
+ if (this.units) {
+ return this.units.getStore().convertValue(this.parseValue(rawValue), this.units.getValue(), true);
+ } else {
+ return this.parseValue(rawValue);
+ }
+ };
+ config.valueToRaw = function (value) {
+ if (this.units) {
+ return String(this.units.getStore().convertValue(value, this.units.getValue(), false));
+ } else {
+ return String(value);
+ }
+ };
+ if (config.units) {
+ config.step = config.units.getStore().convertValue(1, config.units.getValue(), true);
+ }
+ }
+ this.callParent(arguments);
+ }
+});
diff --git a/legacy/web/app/view/CustomTimeField.js b/legacy/web/app/view/CustomTimeField.js
new file mode 100644
index 00000000..c2b44ce1
--- /dev/null
+++ b/legacy/web/app/view/CustomTimeField.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.CustomTimeField', {
+ extend: 'Ext.form.field.Time',
+ xtype: 'customTimeField',
+
+ constructor: function (config) {
+ if (Traccar.app.getPreference('twelveHourFormat', false)) {
+ config.format = Traccar.Style.timeFormat12;
+ } else {
+ config.format = Traccar.Style.timeFormat24;
+ }
+ this.callParent(arguments);
+ }
+});
diff --git a/legacy/web/app/view/DeviceMenu.js b/legacy/web/app/view/DeviceMenu.js
new file mode 100644
index 00000000..06b272ad
--- /dev/null
+++ b/legacy/web/app/view/DeviceMenu.js
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.DeviceMenu', {
+ extend: 'Ext.button.Button',
+ xtype: 'deviceMenu',
+
+ requires: [
+ 'Traccar.view.DeviceMenuController'
+ ],
+
+ glyph: 'xf013@FontAwesome',
+ tooltip: Strings.settingsTitle,
+ tooltipType: 'title',
+
+ menu: {
+ controller: 'deviceMenu',
+
+ items: [{
+ text: Strings.sharedDrivers,
+ glyph: 'xf084@FontAwesome',
+ handler: 'onDriversClick',
+ reference: 'menuDriversButton'
+ }, {
+ text: Strings.sharedGeofences,
+ glyph: 'xf21d@FontAwesome',
+ handler: 'onGeofencesClick',
+ reference: 'menuGeofencesButton'
+ }, {
+ text: Strings.sharedNotifications,
+ glyph: 'xf003@FontAwesome',
+ handler: 'onNotificationsClick',
+ reference: 'menuNotificationsButton'
+ }, {
+ text: Strings.sharedComputedAttributes,
+ glyph: 'xf0ae@FontAwesome',
+ handler: 'onComputedAttributesClick',
+ reference: 'menuComputedAttributesButton'
+ }, {
+ text: Strings.sharedSavedCommands,
+ glyph: 'xf093@FontAwesome',
+ handler: 'onCommandsClick',
+ reference: 'menuCommandsButton'
+ }, {
+ text: Strings.sharedMaintenance,
+ glyph: 'xf0ad@FontAwesome',
+ handler: 'onMaintenancesClick',
+ reference: 'menuMaintenancesButton'
+ }, {
+ hidden: true,
+ text: Strings.sharedDeviceAccumulators,
+ glyph: 'xf0e4@FontAwesome',
+ handler: 'onDeviceAccumulatorsClick',
+ reference: 'menuDeviceAccumulatorsButton'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/DeviceMenuController.js b/legacy/web/app/view/DeviceMenuController.js
new file mode 100644
index 00000000..830ea7ec
--- /dev/null
+++ b/legacy/web/app/view/DeviceMenuController.js
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.DeviceMenuController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.deviceMenu',
+
+ requires: [
+ 'Traccar.view.permissions.Geofences',
+ 'Traccar.view.permissions.Drivers',
+ 'Traccar.view.permissions.Notifications',
+ 'Traccar.view.edit.ComputedAttributes',
+ 'Traccar.view.permissions.SavedCommands',
+ 'Traccar.view.permissions.Maintenances',
+ 'Traccar.view.dialog.DeviceAccumulators',
+ 'Traccar.view.BaseWindow'
+ ],
+
+ init: function () {
+ this.lookupReference('menuDriversButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers'));
+ this.lookupReference('menuComputedAttributesButton').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes'));
+ this.lookupReference('menuCommandsButton').setHidden(Traccar.app.getPreference('limitCommands', false));
+ this.lookupReference('menuDeviceAccumulatorsButton').setHidden(
+ !Traccar.app.getUser().get('administrator') && Traccar.app.getUser().get('userLimit') === 0 || Traccar.app.getVehicleFeaturesDisabled());
+ this.lookupReference('menuMaintenancesButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableMaintenance'));
+ },
+
+ onGeofencesClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedGeofences,
+ items: {
+ xtype: 'linkGeofencesView',
+ baseObjectName: 'deviceId',
+ linkObjectName: 'geofenceId',
+ storeName: 'Geofences',
+ baseObject: this.getView().up('deviceMenu').device.getId()
+ }
+ }).show();
+ },
+
+ onNotificationsClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedNotifications,
+ items: {
+ xtype: 'linkNotificationsView',
+ baseObjectName: 'deviceId',
+ linkObjectName: 'notificationId',
+ storeName: 'Notifications',
+ baseObject: this.getView().up('deviceMenu').device.getId()
+ }
+ }).show();
+ },
+
+ onComputedAttributesClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedComputedAttributes,
+ items: {
+ xtype: 'linkComputedAttributesView',
+ baseObjectName: 'deviceId',
+ linkObjectName: 'attributeId',
+ storeName: 'ComputedAttributes',
+ baseObject: this.getView().up('deviceMenu').device.getId()
+ }
+ }).show();
+ },
+
+ onDriversClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedDrivers,
+ items: {
+ xtype: 'linkDriversView',
+ baseObjectName: 'deviceId',
+ linkObjectName: 'driverId',
+ storeName: 'Drivers',
+ baseObject: this.getView().up('deviceMenu').device.getId()
+ }
+ }).show();
+ },
+
+ onCommandsClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedSavedCommands,
+ items: {
+ xtype: 'linkSavedCommandsView',
+ baseObjectName: 'deviceId',
+ linkObjectName: 'commandId',
+ storeName: 'Commands',
+ baseObject: this.getView().up('deviceMenu').device.getId()
+ }
+ }).show();
+ },
+
+ onMaintenancesClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedMaintenance,
+ items: {
+ xtype: 'linkMaintenancesView',
+ baseObjectName: 'deviceId',
+ linkObjectName: 'maintenanceId',
+ storeName: 'Maintenances',
+ baseObject: this.getView().up('deviceMenu').device.getId()
+ }
+ }).show();
+ },
+
+ onDeviceAccumulatorsClick: function () {
+ var position, dialog = Ext.create('Traccar.view.dialog.DeviceAccumulators');
+ dialog.deviceId = this.getView().up('deviceMenu').device.getId();
+ position = Ext.getStore('LatestPositions').findRecord('deviceId', dialog.deviceId, 0, false, false, true);
+ if (position) {
+ dialog.lookupReference('totalDistance').setValue(position.get('attributes').totalDistance);
+ dialog.lookupReference('hours').setValue(position.get('attributes').hours);
+ }
+ dialog.show();
+ }
+});
diff --git a/legacy/web/app/view/Events.js b/legacy/web/app/view/Events.js
new file mode 100644
index 00000000..439de5af
--- /dev/null
+++ b/legacy/web/app/view/Events.js
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.Events', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'eventsView',
+
+ requires: [
+ 'Traccar.view.EventsController'
+ ],
+
+ controller: 'events',
+
+ store: 'Events',
+
+ stateful: true,
+ stateId: 'events-grid',
+
+ title: Strings.reportEvents,
+
+ sortableColumns: false,
+
+ header: false,
+
+ tbar: {
+ componentCls: 'toolbar-header-style',
+ defaults: {
+ xtype: 'button',
+ tooltipType: 'title',
+ stateEvents: ['toggle'],
+ enableToggle: true,
+ stateful: {
+ pressed: true
+ }
+ },
+ items: [{
+ xtype: 'tbtext',
+ html: Strings.reportEvents,
+ baseCls: 'x-panel-header-title-default'
+ }, {
+ xtype: 'tbfill'
+ }, {
+ glyph: 'xf063@FontAwesome',
+ pressed: true,
+ toggleHandler: 'onScrollToLastClick',
+ stateId: 'events-scroll-to-last-button',
+ tooltip: Strings.eventsScrollToLast,
+ reference: 'scrollToLastButton'
+ }, {
+ id: 'soundButton',
+ glyph: 'xf0a2@FontAwesome',
+ tooltip: Strings.sharedSound,
+ stateId: 'sound-button'
+ }, {
+ glyph: 'xf014@FontAwesome',
+ tooltip: Strings.sharedRemove,
+ handler: 'onRemoveClick',
+ reference: 'removeEventButton',
+ disabled: true,
+ stateful: false,
+ enableToggle: false
+ }, {
+ glyph: 'xf1f8@FontAwesome',
+ tooltip: Strings.reportClear,
+ handler: 'onClearClick',
+ stateful: false,
+ enableToggle: false
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedHide,
+ handler: 'onHideEvents',
+ reference: 'hideEventsButton',
+ hidden: true,
+ stateful: false,
+ enableToggle: false
+ }]
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedDevice,
+ dataIndex: 'deviceId',
+ renderer: Traccar.AttributeFormatter.getFormatter('deviceId')
+ }, {
+ flex: 2,
+ text: Strings.positionEvent,
+ dataIndex: 'text'
+ }, {
+ text: Strings.positionFixTime,
+ dataIndex: 'eventTime',
+ renderer: Traccar.AttributeFormatter.getFormatter('eventTime')
+ }]
+ }
+});
diff --git a/legacy/web/app/view/EventsController.js b/legacy/web/app/view/EventsController.js
new file mode 100644
index 00000000..e11b4ff6
--- /dev/null
+++ b/legacy/web/app/view/EventsController.js
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.EventsController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.events',
+
+ config: {
+ listen: {
+ controller: {
+ '*': {
+ selectdevice: 'deselectEvent',
+ selectreport: 'deselectEvent'
+ },
+ 'map': {
+ deselectfeature: 'deselectFeature'
+ }
+ },
+ store: {
+ '#Events': {
+ add: 'onAddEvent'
+ }
+ }
+ }
+ },
+
+ init: function () {
+ var self = this;
+ setInterval(function () {
+ self.getView().getView().refresh();
+ }, Traccar.Style.refreshPeriod);
+
+ if (Traccar.app.isMobile()) {
+ this.lookupReference('hideEventsButton').setHidden(false);
+ }
+ },
+
+ onRemoveClick: function () {
+ var event, positionId;
+ event = this.getView().getSelectionModel().getSelection()[0];
+ if (event) {
+ Ext.getStore('Events').remove(event);
+ positionId = event.get('positionId');
+ if (positionId && !Ext.getStore('Events').findRecord('positionId', positionId, 0, false, false, true)) {
+ Ext.getStore('EventPositions').remove(Ext.getStore('EventPositions').getById(positionId));
+ }
+ }
+ },
+
+ onClearClick: function () {
+ Ext.getStore('Events').removeAll();
+ Ext.getStore('EventPositions').removeAll();
+ },
+
+ onAddEvent: function () {
+ if (this.lookupReference('scrollToLastButton').pressed) {
+ this.getView().scrollBy(0, Number.POSITIVE_INFINITY, true);
+ }
+ },
+
+ onScrollToLastClick: function (button, pressed) {
+ if (pressed) {
+ this.onAddEvent();
+ }
+ },
+
+ onHideEvents: function () {
+ Traccar.app.showEvents(false);
+ },
+
+
+ deselectEvent: function (object) {
+ if (object) {
+ this.deselectFeature();
+ }
+ },
+
+ deselectFeature: function () {
+ this.getView().getSelectionModel().deselectAll();
+ },
+
+ onSelectionChange: function (selection, selected) {
+ var event, positionId, position;
+ event = selected.length > 0 ? selected[0] : null;
+ if (event) {
+ positionId = event.get('positionId');
+ if (positionId) {
+ position = Ext.getStore('EventPositions').getById(positionId);
+ if (position) {
+ this.fireEvent('selectevent', position);
+ } else {
+ Ext.getStore('EventPositions').load({
+ params: {
+ id: positionId
+ },
+ scope: this,
+ addRecords: true,
+ callback: function (records, operation, success) {
+ if (success && records.length > 0) {
+ this.fireEvent('selectevent', records[0]);
+ }
+ }
+ });
+ }
+ } else {
+ this.fireEvent('selectevent');
+ }
+ }
+ this.lookupReference('removeEventButton').setDisabled(!event);
+ }
+});
diff --git a/legacy/web/app/view/GridPanel.js b/legacy/web/app/view/GridPanel.js
new file mode 100644
index 00000000..848af081
--- /dev/null
+++ b/legacy/web/app/view/GridPanel.js
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.GridPanel', {
+ extend: 'Ext.grid.Panel',
+ xtype: 'customGridPanel',
+
+ requires: [
+ 'Ext.grid.filters.Filters'
+ ],
+
+ plugins: 'gridfilters',
+
+ viewConfig: {
+ enableTextSelection: true,
+ getRowClass: function () {
+ return this.enableTextSelection ? 'x-selectable' : '';
+ }
+ }
+});
diff --git a/legacy/web/app/view/Main.js b/legacy/web/app/view/Main.js
new file mode 100644
index 00000000..0504245e
--- /dev/null
+++ b/legacy/web/app/view/Main.js
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.Main', {
+ extend: 'Ext.container.Viewport',
+ alias: 'widget.main',
+
+ requires: [
+ 'Traccar.view.MainController',
+ 'Traccar.view.edit.Devices',
+ 'Traccar.view.State',
+ 'Traccar.view.Report',
+ 'Traccar.view.Events',
+ 'Traccar.view.map.Map'
+ ],
+
+ controller: 'mainController',
+
+ layout: 'border',
+
+ defaults: {
+ header: false,
+ collapsible: true,
+ split: true
+ },
+
+ items: [{
+ region: 'west',
+ layout: 'border',
+ width: Traccar.Style.deviceWidth,
+ title: Strings.devicesAndState,
+ titleCollapse: true,
+ floatable: false,
+ stateful: true,
+ stateId: 'devices-and-state-panel',
+
+ defaults: {
+ split: true,
+ flex: 1
+ },
+
+ items: [{
+ region: 'center',
+ xtype: 'devicesView'
+ }, {
+ region: 'south',
+ xtype: 'stateView'
+ }]
+ }, {
+ region: 'south',
+ xtype: 'reportView',
+ reference: 'reportView',
+ height: Traccar.Style.reportHeight,
+ collapsed: true,
+ titleCollapse: true,
+ floatable: false
+ }, {
+ region: 'center',
+ xtype: 'mapView',
+ collapsible: false
+ }, {
+ region: 'east',
+ xtype: 'eventsView',
+ reference: 'eventsView',
+ width: Traccar.Style.deviceWidth,
+ collapsed: true,
+ titleCollapse: true,
+ floatable: false
+ }]
+});
diff --git a/legacy/web/app/view/MainController.js b/legacy/web/app/view/MainController.js
new file mode 100644
index 00000000..8ed986af
--- /dev/null
+++ b/legacy/web/app/view/MainController.js
@@ -0,0 +1,26 @@
+/*
+ * 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
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.MainController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.mainController',
+
+ init: function () {
+ this.lookupReference('reportView').setHidden(Traccar.app.getPreference('disableReports', false));
+ this.lookupReference('eventsView').setHidden(Traccar.app.getBooleanAttributePreference('ui.disableEvents'));
+ }
+});
diff --git a/legacy/web/app/view/MainMobile.js b/legacy/web/app/view/MainMobile.js
new file mode 100644
index 00000000..8aab7710
--- /dev/null
+++ b/legacy/web/app/view/MainMobile.js
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.MainMobile', {
+ extend: 'Ext.container.Viewport',
+ alias: 'widget.mainMobile',
+
+ id: 'rootPanel',
+
+ requires: [
+ 'Traccar.view.edit.Devices',
+ 'Traccar.view.State',
+ 'Traccar.view.Report',
+ 'Traccar.view.Events',
+ 'Traccar.view.map.Map'
+ ],
+
+ layout: 'card',
+
+ items: [{
+ layout: 'border',
+
+ defaults: {
+ header: false,
+ collapsible: true,
+ split: true
+ },
+
+ items: [{
+ region: 'east',
+ xtype: 'stateView',
+ title: Strings.stateTitle,
+ flex: 4,
+ collapsed: true,
+ collapseMode: 'mini',
+ titleCollapse: true,
+ floatable: false,
+ stateId: 'mobile-state-grid'
+ }, {
+ region: 'center',
+ xtype: 'mapView',
+ collapsible: false,
+ flex: 2
+ }, {
+ region: 'south',
+ xtype: 'devicesView',
+ title: Strings.deviceTitle,
+ flex: 1,
+ collapsed: true,
+ titleCollapse: true,
+ floatable: false,
+ stateId: 'mobile-devices-grid'
+ }]
+ }, {
+ xtype: 'reportView'
+ }, {
+ xtype: 'eventsView'
+ }]
+});
diff --git a/legacy/web/app/view/Report.js b/legacy/web/app/view/Report.js
new file mode 100644
index 00000000..deedb747
--- /dev/null
+++ b/legacy/web/app/view/Report.js
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2015 - 2016 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.Report', {
+ extend: 'Ext.panel.Panel',
+ xtype: 'reportView',
+
+ requires: [
+ 'Traccar.view.ReportController',
+ 'Traccar.view.GridPanel'
+ ],
+
+ controller: 'report',
+
+ title: Strings.reportTitle,
+
+ tools: [{
+ type: 'close',
+ tooltip: Strings.sharedHide,
+ handler: 'hideReports'
+ }],
+
+ tbar: {
+ scrollable: true,
+ items: [{
+ xtype: 'tbtext',
+ html: Strings.sharedType
+ }, {
+ xtype: 'combobox',
+ reference: 'reportTypeField',
+ store: 'ReportTypes',
+ displayField: 'name',
+ valueField: 'key',
+ editable: false,
+ listeners: {
+ change: 'onTypeChange'
+ }
+ }, '-', {
+ text: Strings.reportConfigure,
+ handler: 'onConfigureClick'
+ }, '-', {
+ text: Strings.reportShow,
+ reference: 'showButton',
+ disabled: true,
+ handler: 'onReportClick'
+ }, {
+ text: Strings.reportExport,
+ reference: 'exportButton',
+ disabled: true,
+ handler: 'onReportClick'
+ }, {
+ text: Strings.reportEmail,
+ reference: 'emailButton',
+ disabled: true,
+ handler: 'onReportClick'
+ }, {
+ text: Strings.reportClear,
+ handler: 'onClearClick'
+ }]
+ },
+
+ layout: 'card',
+
+ items: [{
+ xtype: 'customGridPanel',
+ itemId: 'grid',
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [
+ ]
+ },
+ style: Traccar.Style.reportGridStyle
+ }, {
+ xtype: 'cartesian',
+ itemId: 'chart',
+ plugins: {
+ ptype: 'chartitemevents',
+ moveEvents: true
+ },
+ store: 'ReportRoute',
+ axes: [{
+ title: Strings.reportChart,
+ type: 'numeric',
+ position: 'left'
+ }, {
+ type: 'time',
+ position: 'bottom',
+ fields: ['fixTime']
+ }],
+ listeners: {
+ itemclick: 'onChartMarkerClick'
+ },
+ insetPadding: Traccar.Style.chartPadding
+ }]
+});
diff --git a/legacy/web/app/view/ReportController.js b/legacy/web/app/view/ReportController.js
new file mode 100644
index 00000000..8f63bd31
--- /dev/null
+++ b/legacy/web/app/view/ReportController.js
@@ -0,0 +1,678 @@
+/*
+ * Copyright 2015 - 2016 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.ReportController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.report',
+
+ requires: [
+ 'Traccar.AttributeFormatter',
+ 'Traccar.model.Position',
+ 'Traccar.model.ReportTrip',
+ 'Traccar.view.dialog.ReportConfig',
+ 'Traccar.store.ReportEventTypes'
+ ],
+
+ config: {
+ listen: {
+ controller: {
+ '*': {
+ selectdevice: 'deselectReport',
+ selectevent: 'deselectReport',
+ showsingleevent: 'showSingleEvent'
+ },
+ 'map': {
+ selectreport: 'selectReport',
+ deselectfeature: 'deselectFeature'
+ }
+ },
+ global: {
+ routegeocode: 'onGeocode'
+ },
+ store: {
+ '#ReportEvents': {
+ add: 'loadRelatedPositions',
+ load: 'loadRelatedPositions'
+ },
+ '#ReportRoute': {
+ load: 'loadRoute'
+ },
+ '#ReportStops': {
+ load: 'loadRelatedPositions'
+ }
+ }
+ }
+ },
+
+ hideReports: function () {
+ Traccar.app.showReports(false);
+ },
+
+ getGrid: function () {
+ return this.getView().getComponent('grid');
+ },
+
+ getChart: function () {
+ return this.getView().getComponent('chart');
+ },
+
+ init: function () {
+ var i, data, attribute;
+ data = Ext.getStore('PositionAttributes').getData().items;
+ for (i = 0; i < data.length; i++) {
+ attribute = data[i];
+ this.routeColumns.push({
+ text: attribute.get('name'),
+ dataIndex: 'attribute.' + attribute.get('key'),
+ renderer: Traccar.AttributeFormatter.getAttributeFormatter(attribute.get('key')),
+ hidden: true
+ });
+ }
+ if (Traccar.app.getVehicleFeaturesDisabled()) {
+ for (i = 0; i < this.summaryColumns.length; i++) {
+ if (this.summaryColumns[i].dataIndex.match('engineHours|spentFuel')) {
+ this.summaryColumns[i].hidden = true;
+ }
+ }
+ for (i = 0; i < this.tripsColumns.length; i++) {
+ if (this.tripsColumns[i].dataIndex.match('spentFuel|driverUniqueId')) {
+ this.tripsColumns[i].hidden = true;
+ }
+ }
+ for (i = 0; i < this.stopsColumns.length; i++) {
+ if (this.stopsColumns[i].dataIndex.match('engineHours|spentFuel')) {
+ this.stopsColumns[i].hidden = true;
+ }
+ }
+ }
+ },
+
+ onConfigureClick: function () {
+ var dialog = Ext.create('Traccar.view.dialog.ReportConfig');
+ dialog.lookupReference('eventTypeField').setHidden(this.lookupReference('reportTypeField').getValue() !== 'events');
+ dialog.lookupReference('chartTypeField').setHidden(this.lookupReference('reportTypeField').getValue() !== 'chart');
+ dialog.callingPanel = this;
+ dialog.lookupReference('deviceField').setValue(this.deviceId);
+ dialog.lookupReference('groupField').setValue(this.groupId);
+ if (this.eventType !== undefined) {
+ dialog.lookupReference('eventTypeField').setValue(this.eventType);
+ } else {
+ dialog.lookupReference('eventTypeField').setValue([Traccar.store.ReportEventTypes.allEvents]);
+ }
+ if (this.chartType !== undefined) {
+ dialog.lookupReference('chartTypeField').setValue(this.chartType);
+ }
+ if (this.showMarkers !== undefined) {
+ dialog.lookupReference('showMarkersField').setValue(this.showMarkers);
+ }
+ if (this.fromDate !== undefined) {
+ dialog.lookupReference('fromDateField').setValue(this.fromDate);
+ }
+ if (this.fromTime !== undefined) {
+ dialog.lookupReference('fromTimeField').setValue(this.fromTime);
+ }
+ if (this.toDate !== undefined) {
+ dialog.lookupReference('toDateField').setValue(this.toDate);
+ }
+ if (this.toTime !== undefined) {
+ dialog.lookupReference('toTimeField').setValue(this.toTime);
+ }
+ if (this.period !== undefined) {
+ dialog.lookupReference('periodField').setValue(this.period);
+ }
+ dialog.show();
+ },
+
+ updateButtons: function () {
+ var reportType, disabled, devices, time;
+ reportType = this.lookupReference('reportTypeField').getValue();
+ devices = this.deviceId && this.deviceId.length !== 0 || this.groupId && this.groupId.length !== 0;
+ time = this.fromDate && this.fromTime && this.toDate && this.toTime;
+ disabled = !reportType || !devices || !time || this.reportProgress;
+ this.lookupReference('showButton').setDisabled(disabled);
+ this.lookupReference('exportButton').setDisabled(reportType === 'chart' || disabled);
+ this.lookupReference('emailButton').setDisabled(reportType === 'chart' || disabled);
+ },
+
+ onReportClick: function (button) {
+ var reportType, from, to, store, url, daily;
+
+ this.getGrid().getSelectionModel().deselectAll();
+
+ reportType = this.lookupReference('reportTypeField').getValue();
+ if (reportType && (this.deviceId || this.groupId)) {
+ from = new Date(
+ this.fromDate.getFullYear(), this.fromDate.getMonth(), this.fromDate.getDate(),
+ this.fromTime.getHours(), this.fromTime.getMinutes(), this.fromTime.getSeconds(), this.fromTime.getMilliseconds());
+
+ to = new Date(
+ this.toDate.getFullYear(), this.toDate.getMonth(), this.toDate.getDate(),
+ this.toTime.getHours(), this.toTime.getMinutes(), this.toTime.getSeconds(), this.toTime.getMilliseconds());
+
+ daily = reportType === 'daily';
+
+ this.reportProgress = true;
+ this.updateButtons();
+
+ if (button.reference === 'showButton') {
+ if (reportType === 'chart') {
+ store = this.getChart().getStore();
+ this.getChart().setSeries([]);
+ } else {
+ store = this.getGrid().getStore();
+ }
+ store.showMarkers = this.showMarkers;
+ store.load({
+ scope: this,
+ callback: function () {
+ this.reportProgress = false;
+ this.updateButtons();
+ },
+ params: {
+ deviceId: this.deviceId,
+ groupId: this.groupId,
+ type: this.eventType,
+ from: from.toISOString(),
+ to: to.toISOString(),
+ daily: daily
+ }
+ });
+ } else {
+ url = this.getGrid().getStore().getProxy().url;
+ this.excelReport(url, {
+ deviceId: this.deviceId,
+ groupId: this.groupId,
+ type: this.eventType,
+ from: Ext.Date.format(from, 'c'),
+ to: Ext.Date.format(to, 'c'),
+ daily: daily,
+ mail: button.reference === 'emailButton'
+ });
+ }
+ }
+ },
+
+ onClearClick: function () {
+ var reportType = this.lookupReference('reportTypeField').getValue();
+ this.clearReport(reportType);
+ },
+
+ clearReport: function (reportType) {
+ this.getGrid().getStore().removeAll();
+ if (reportType === 'trips' || reportType === 'events' || reportType === 'stops') {
+ Ext.getStore('ReportRoute').removeAll();
+ }
+ if (reportType === 'chart') {
+ this.getChart().getStore().removeAll();
+ }
+ },
+
+ onSelectionChange: function (selection, selected) {
+ var report;
+ if (selected.length > 0) {
+ report = selected[0];
+ this.fireEvent('selectreport', report, true);
+ if (report instanceof Traccar.model.ReportTrip) {
+ this.selectTrip(report);
+ }
+ if (report instanceof Traccar.model.Event || report instanceof Traccar.model.ReportStop) {
+ this.selectPositionRelated(report);
+ }
+ }
+ },
+
+ selectReport: function (object) {
+ var positionRelated, reportType = this.lookupReference('reportTypeField').getValue();
+ if (object instanceof Traccar.model.Position) {
+ if (reportType === 'route') {
+ this.getGrid().getSelectionModel().select([object], false, true);
+ this.getGrid().getView().focusRow(object);
+ } else if (reportType === 'events' || reportType === 'stops') {
+ positionRelated = this.getGrid().getStore().findRecord('positionId', object.get('id'), 0, false, true, true);
+ this.getGrid().getSelectionModel().select([positionRelated], false, true);
+ this.getGrid().getView().focusRow(positionRelated);
+ }
+ }
+ },
+
+ deselectReport: function (object) {
+ if (object) {
+ this.deselectFeature();
+ }
+ },
+
+ deselectFeature: function () {
+ if (this.lookupReference('reportTypeField').getValue() !== 'trips') {
+ this.getGrid().getSelectionModel().deselectAll();
+ }
+ },
+
+ selectTrip: function (trip) {
+ var from, to;
+ from = new Date(trip.get('startTime'));
+ to = new Date(trip.get('endTime'));
+ Ext.getStore('ReportRoute').removeAll();
+ Ext.getStore('ReportRoute').showMarkers = this.showMarkers;
+ Ext.getStore('ReportRoute').load({
+ params: {
+ deviceId: trip.get('deviceId'),
+ from: from.toISOString(),
+ to: to.toISOString()
+ }
+ });
+ },
+
+ selectPositionRelated: function (report) {
+ var position;
+ if (report.get('positionId')) {
+ position = Ext.getStore('ReportRoute').getById(report.get('positionId'));
+ if (position) {
+ this.fireEvent('selectreport', position, true);
+ }
+ }
+ },
+
+ loadRelatedPositions: function (store, data) {
+ var i, reportObject, positionIds = [];
+ Ext.getStore('ReportRoute').removeAll();
+ if (data) {
+ for (i = 0; i < data.length; i++) {
+ reportObject = data[i];
+ if (reportObject.get('positionId')) {
+ positionIds.push(reportObject.get('positionId'));
+ }
+ }
+ }
+ if (positionIds.length > 0) {
+ Ext.getStore('Positions').load({
+ params: {
+ id: positionIds
+ },
+ scope: this,
+ callback: function (records, operation, success) {
+ if (success) {
+ Ext.getStore('ReportRoute').showMarkers = this.showMarkers;
+ Ext.getStore('ReportRoute').add(records);
+ if (records.length === 1) {
+ this.fireEvent('selectreport', records[0], false);
+ }
+ }
+ }
+ });
+ }
+ },
+
+ loadRoute: function (store) {
+ var i, deviceIds, chartSeries, deviceStore;
+ if (this.lookupReference('reportTypeField').getValue() === 'chart') {
+ this.getChart().getAxes()[0].setTitle(
+ Ext.getStore('ReportChartTypes').findRecord('key', this.chartType).get('name'));
+ chartSeries = [];
+ deviceIds = store.collect('deviceId');
+ for (i = 0; i < deviceIds.length; i++) {
+ deviceStore = Ext.create('Ext.data.ChainedStore', {
+ source: 'ReportRoute',
+ filters: [{
+ property: 'deviceId',
+ value: deviceIds[i]
+ }]
+ });
+ chartSeries.push({
+ type: 'line',
+ store: deviceStore,
+ yField: this.chartType,
+ xField: 'fixTime',
+ highlightCfg: {
+ scaling: Traccar.Style.chartMarkerHighlightScaling
+ },
+ colors: [Traccar.app.getReportColor(deviceIds[i])],
+ marker: {
+ type: 'circle',
+ radius: Traccar.Style.chartMarkerRadius,
+ fill: Traccar.app.getReportColor(deviceIds[i])
+ }
+ });
+ }
+ this.getChart().setSeries(chartSeries);
+ }
+ },
+
+ onChartMarkerClick: function (chart, item) {
+ this.fireEvent('selectreport', item.record, true);
+ },
+
+ showSingleEvent: function (eventId) {
+ this.lookupReference('reportTypeField').setValue('events');
+ Ext.getStore('Events').load({
+ id: eventId,
+ scope: this,
+ callback: function (records, operation, success) {
+ if (success) {
+ Ext.getStore('ReportEvents').add(records);
+ if (records.length > 0) {
+ if (!records[0].get('positionId')) {
+ if (Traccar.app.isMobile()) {
+ Traccar.app.showReports(true);
+ } else {
+ this.getView().expand();
+ }
+ }
+ this.getGrid().getSelectionModel().select([records[0]], false, true);
+ this.getGrid().getView().focusRow(records[0]);
+ }
+ }
+ }
+ });
+ },
+
+ excelReport: function (requestUrl, requestParams) {
+ Ext.Ajax.request({
+ url: requestUrl,
+ method: 'GET',
+ timeout: Traccar.Style.reportTimeout,
+ params: requestParams,
+ headers: {
+ Accept: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
+ },
+ binary: true,
+ scope: this,
+ callback: function (options, success, response) {
+ var disposition, filename, type, blob, url, downloadUrl;
+ if (success && !requestParams.mail) {
+ disposition = response.getResponseHeader('Content-Disposition');
+ filename = disposition.slice(disposition.indexOf('=') + 1, disposition.length);
+ type = response.getResponseHeader('Content-Type');
+ blob = new Blob([response.responseBytes], {type: type});
+ if (typeof window.navigator.msSaveBlob !== 'undefined') {
+ // IE workaround
+ window.navigator.msSaveBlob(blob, filename);
+ } else {
+ url = window.URL || window.webkitURL;
+ downloadUrl = url.createObjectURL(blob);
+ if (filename) {
+ Ext.dom.Helper.append(Ext.getBody(), {
+ tag: 'a',
+ href: downloadUrl,
+ download: filename
+ }).click();
+ }
+ setTimeout(function () {
+ url.revokeObjectURL(downloadUrl);
+ }, 100);
+ }
+ }
+ this.reportProgress = false;
+ this.updateButtons();
+ }
+ });
+ },
+
+ onTypeChange: function (combobox, newValue, oldValue) {
+ if (oldValue !== null) {
+ this.clearReport(oldValue);
+ }
+
+ if (newValue === 'route') {
+ this.getGrid().reconfigure('ReportRoute', this.routeColumns);
+ this.getView().getLayout().setActiveItem('grid');
+ } else if (newValue === 'events') {
+ this.getGrid().reconfigure('ReportEvents', this.eventsColumns);
+ this.getView().getLayout().setActiveItem('grid');
+ } else if (newValue === 'summary' || newValue === 'daily') {
+ this.getGrid().reconfigure('ReportSummary', this.summaryColumns);
+ this.getView().getLayout().setActiveItem('grid');
+ } else if (newValue === 'trips') {
+ this.getGrid().reconfigure('ReportTrips', this.tripsColumns);
+ this.getView().getLayout().setActiveItem('grid');
+ } else if (newValue === 'stops') {
+ this.getGrid().reconfigure('ReportStops', this.stopsColumns);
+ this.getView().getLayout().setActiveItem('grid');
+ } else if (newValue === 'chart') {
+ this.getView().getLayout().setActiveItem('chart');
+ }
+
+ this.updateButtons();
+ },
+
+ onGeocode: function (positionId) {
+ var position = Ext.getStore('ReportRoute').getById(positionId);
+ if (position && !position.get('address')) {
+ Ext.Ajax.request({
+ scope: this,
+ method: 'GET',
+ url: 'api/server/geocode',
+ params: {
+ latitude: position.get('latitude'),
+ longitude: position.get('longitude')
+ },
+ success: function (response) {
+ position.set('address', response.responseText);
+ position.commit();
+ this.fireEvent('selectReport', position);
+ },
+ failure: function (response) {
+ Traccar.app.showError(response);
+ }
+ });
+ }
+ },
+
+ routeColumns: [{
+ text: Strings.reportDeviceName,
+ dataIndex: 'deviceId',
+ renderer: Traccar.AttributeFormatter.getFormatter('deviceId')
+ }, {
+ text: Strings.positionValid,
+ dataIndex: 'valid',
+ renderer: Traccar.AttributeFormatter.getFormatter('valid')
+ }, {
+ text: Strings.positionFixTime,
+ dataIndex: 'fixTime',
+ xtype: 'datecolumn',
+ renderer: Traccar.AttributeFormatter.getFormatter('fixTime')
+ }, {
+ text: Strings.positionLatitude,
+ dataIndex: 'latitude',
+ renderer: Traccar.AttributeFormatter.getFormatter('latitude')
+ }, {
+ text: Strings.positionLongitude,
+ dataIndex: 'longitude',
+ renderer: Traccar.AttributeFormatter.getFormatter('longitude')
+ }, {
+ text: Strings.positionAltitude,
+ dataIndex: 'altitude',
+ renderer: Traccar.AttributeFormatter.getFormatter('altitude')
+ }, {
+ text: Strings.positionSpeed,
+ dataIndex: 'speed',
+ renderer: Traccar.AttributeFormatter.getFormatter('speed')
+ }, {
+ text: Strings.positionAddress,
+ dataIndex: 'address',
+ renderer: function (value, metaData, record) {
+ if (!value) {
+ return '<a href="#" onclick="Ext.fireEvent(\'routegeocode\', ' +
+ record.getId() + ')" >' +
+ Strings.sharedShowAddress + '</a>';
+ }
+ return Traccar.AttributeFormatter.getFormatter('address')(value);
+ }
+ }],
+
+ eventsColumns: [{
+ text: Strings.positionFixTime,
+ dataIndex: 'eventTime',
+ xtype: 'datecolumn',
+ renderer: Traccar.AttributeFormatter.getFormatter('eventTime')
+ }, {
+ text: Strings.reportDeviceName,
+ dataIndex: 'deviceId',
+ renderer: Traccar.AttributeFormatter.getFormatter('deviceId')
+ }, {
+ text: Strings.sharedType,
+ dataIndex: 'type',
+ renderer: function (value) {
+ return Traccar.app.getEventString(value);
+ }
+ }, {
+ text: Strings.positionAlarm,
+ dataIndex: 'attributes',
+ renderer: function (value) {
+ return value['alarm'];
+ }
+ }, {
+ text: Strings.sharedGeofence,
+ dataIndex: 'geofenceId',
+ renderer: Traccar.AttributeFormatter.getFormatter('geofenceId')
+ }, {
+ text: Strings.sharedMaintenance,
+ dataIndex: 'maintenanceId',
+ renderer: Traccar.AttributeFormatter.getFormatter('maintenanceId')
+ }],
+
+ summaryColumns: [{
+ text: Strings.reportDeviceName,
+ dataIndex: 'deviceId',
+ renderer: Traccar.AttributeFormatter.getFormatter('deviceId')
+ }, {
+ text: Strings.reportStartDate,
+ dataIndex: 'startTime',
+ xtype: 'datecolumn',
+ renderer: Traccar.AttributeFormatter.dateFormatter
+ }, {
+ text: Strings.sharedDistance,
+ dataIndex: 'distance',
+ renderer: Traccar.AttributeFormatter.getFormatter('distance')
+ }, {
+ text: Strings.reportStartOdometer,
+ dataIndex: 'startOdometer',
+ renderer: Traccar.AttributeFormatter.getFormatter('distance')
+ }, {
+ text: Strings.reportEndOdometer,
+ dataIndex: 'endOdometer',
+ renderer: Traccar.AttributeFormatter.getFormatter('distance')
+ }, {
+ text: Strings.reportAverageSpeed,
+ dataIndex: 'averageSpeed',
+ renderer: Traccar.AttributeFormatter.getFormatter('speed')
+ }, {
+ text: Strings.reportMaximumSpeed,
+ dataIndex: 'maxSpeed',
+ renderer: Traccar.AttributeFormatter.getFormatter('speed')
+ }, {
+ text: Strings.reportEngineHours,
+ dataIndex: 'engineHours',
+ renderer: Traccar.AttributeFormatter.getFormatter('duration')
+ }, {
+ text: Strings.reportSpentFuel,
+ dataIndex: 'spentFuel',
+ renderer: Traccar.AttributeFormatter.getFormatter('spentFuel')
+ }],
+
+ tripsColumns: [{
+ text: Strings.reportDeviceName,
+ dataIndex: 'deviceId',
+ renderer: Traccar.AttributeFormatter.getFormatter('deviceId')
+ }, {
+ text: Strings.reportStartTime,
+ dataIndex: 'startTime',
+ xtype: 'datecolumn',
+ renderer: Traccar.AttributeFormatter.getFormatter('startTime')
+ }, {
+ text: Strings.reportStartOdometer,
+ dataIndex: 'startOdometer',
+ renderer: Traccar.AttributeFormatter.getFormatter('distance')
+ }, {
+ text: Strings.reportStartAddress,
+ dataIndex: 'startAddress',
+ renderer: Traccar.AttributeFormatter.getFormatter('address')
+ }, {
+ text: Strings.reportEndTime,
+ dataIndex: 'endTime',
+ xtype: 'datecolumn',
+ renderer: Traccar.AttributeFormatter.getFormatter('endTime')
+ }, {
+ text: Strings.reportEndOdometer,
+ dataIndex: 'endOdometer',
+ renderer: Traccar.AttributeFormatter.getFormatter('distance')
+ }, {
+ text: Strings.reportEndAddress,
+ dataIndex: 'endAddress',
+ renderer: Traccar.AttributeFormatter.getFormatter('address')
+ }, {
+ text: Strings.sharedDistance,
+ dataIndex: 'distance',
+ renderer: Traccar.AttributeFormatter.getFormatter('distance')
+ }, {
+ text: Strings.reportAverageSpeed,
+ dataIndex: 'averageSpeed',
+ renderer: Traccar.AttributeFormatter.getFormatter('speed')
+ }, {
+ text: Strings.reportMaximumSpeed,
+ dataIndex: 'maxSpeed',
+ renderer: Traccar.AttributeFormatter.getFormatter('speed')
+ }, {
+ text: Strings.reportDuration,
+ dataIndex: 'duration',
+ renderer: Traccar.AttributeFormatter.getFormatter('duration')
+ }, {
+ text: Strings.reportSpentFuel,
+ dataIndex: 'spentFuel',
+ renderer: Traccar.AttributeFormatter.getFormatter('spentFuel')
+ }, {
+ text: Strings.sharedDriver,
+ dataIndex: 'driverUniqueId',
+ renderer: Traccar.AttributeFormatter.getFormatter('driverUniqueId')
+ }],
+
+ stopsColumns: [{
+ text: Strings.reportDeviceName,
+ dataIndex: 'deviceId',
+ renderer: Traccar.AttributeFormatter.getFormatter('deviceId')
+ }, {
+ text: Strings.reportStartTime,
+ dataIndex: 'startTime',
+ xtype: 'datecolumn',
+ renderer: Traccar.AttributeFormatter.getFormatter('startTime')
+ }, {
+ text: Strings.positionOdometer,
+ dataIndex: 'startOdometer',
+ renderer: Traccar.AttributeFormatter.getFormatter('distance')
+ }, {
+ text: Strings.positionAddress,
+ dataIndex: 'address',
+ renderer: Traccar.AttributeFormatter.getFormatter('address')
+ }, {
+ text: Strings.reportEndTime,
+ dataIndex: 'endTime',
+ xtype: 'datecolumn',
+ renderer: Traccar.AttributeFormatter.getFormatter('endTime')
+ }, {
+ text: Strings.reportDuration,
+ dataIndex: 'duration',
+ renderer: Traccar.AttributeFormatter.getFormatter('duration')
+ }, {
+ text: Strings.reportEngineHours,
+ dataIndex: 'engineHours',
+ renderer: Traccar.AttributeFormatter.getFormatter('duration')
+ }, {
+ text: Strings.reportSpentFuel,
+ dataIndex: 'spentFuel',
+ renderer: Traccar.AttributeFormatter.getFormatter('spentFuel')
+ }]
+});
diff --git a/legacy/web/app/view/SettingsMenu.js b/legacy/web/app/view/SettingsMenu.js
new file mode 100644
index 00000000..0a81d520
--- /dev/null
+++ b/legacy/web/app/view/SettingsMenu.js
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2015 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.SettingsMenu', {
+ extend: 'Ext.button.Button',
+ xtype: 'settingsMenu',
+
+ requires: [
+ 'Traccar.view.SettingsMenuController'
+ ],
+
+ glyph: 'xf013@FontAwesome',
+ tooltip: Strings.settingsTitle,
+ tooltipType: 'title',
+
+ menu: {
+ controller: 'settings',
+
+ items: [{
+ hidden: true,
+ text: Strings.settingsUser,
+ glyph: 'xf007@FontAwesome',
+ handler: 'onUserClick',
+ reference: 'settingsUserButton'
+ }, {
+ hidden: true,
+ text: Strings.settingsGroups,
+ glyph: 'xf247@FontAwesome',
+ handler: 'onGroupsClick',
+ reference: 'settingsGroupsButton'
+ }, {
+ hidden: true,
+ text: Strings.sharedDrivers,
+ glyph: 'xf084@FontAwesome',
+ handler: 'onDriversClick',
+ reference: 'settingsDriversButton'
+ }, {
+ hidden: true,
+ text: Strings.sharedGeofences,
+ glyph: 'xf21d@FontAwesome',
+ handler: 'onGeofencesClick',
+ reference: 'settingsGeofencesButton'
+ }, {
+ hidden: true,
+ text: Strings.settingsServer,
+ glyph: 'xf233@FontAwesome',
+ handler: 'onServerClick',
+ reference: 'settingsServerButton'
+ }, {
+ hidden: true,
+ text: Strings.settingsUsers,
+ glyph: 'xf0c0@FontAwesome',
+ handler: 'onUsersClick',
+ reference: 'settingsUsersButton'
+ }, {
+ hidden: true,
+ text: Strings.sharedNotifications,
+ glyph: 'xf003@FontAwesome',
+ handler: 'onNotificationsClick',
+ reference: 'settingsNotificationsButton'
+ }, {
+ hidden: true,
+ text: Strings.sharedComputedAttributes,
+ glyph: 'xf0ae@FontAwesome',
+ handler: 'onComputedAttributesClick',
+ reference: 'settingsComputedAttributesButton'
+ }, {
+ hidden: true,
+ text: Strings.statisticsTitle,
+ glyph: 'xf080@FontAwesome',
+ handler: 'onStatisticsClick',
+ reference: 'settingsStatisticsButton'
+ }, {
+ hidden: true,
+ text: Strings.sharedCalendars,
+ glyph: 'xf073@FontAwesome',
+ handler: 'onCalendarsClick',
+ reference: 'settingsCalendarsButton'
+ }, {
+ hidden: true,
+ text: Strings.sharedSavedCommands,
+ glyph: 'xf093@FontAwesome',
+ handler: 'onCommandsClick',
+ reference: 'settingsCommandsButton'
+ }, {
+ hidden: true,
+ text: Strings.sharedMaintenance,
+ glyph: 'xf0ad@FontAwesome',
+ handler: 'onMaintenancesClick',
+ reference: 'settingsMaintenancesButton'
+ }, {
+ text: Strings.loginLogout,
+ glyph: 'xf08b@FontAwesome',
+ handler: 'onLogoutClick'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/SettingsMenuController.js b/legacy/web/app/view/SettingsMenuController.js
new file mode 100644
index 00000000..c8018f66
--- /dev/null
+++ b/legacy/web/app/view/SettingsMenuController.js
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2015 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.SettingsMenuController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.settings',
+
+ requires: [
+ 'Traccar.view.dialog.LoginController',
+ 'Traccar.view.dialog.User',
+ 'Traccar.view.dialog.Server',
+ 'Traccar.view.edit.Users',
+ 'Traccar.view.edit.Groups',
+ 'Traccar.view.edit.Geofences',
+ 'Traccar.view.edit.Drivers',
+ 'Traccar.view.edit.Notifications',
+ 'Traccar.view.edit.ComputedAttributes',
+ 'Traccar.view.Statistics',
+ 'Traccar.view.edit.Calendars',
+ 'Traccar.view.edit.SavedCommands',
+ 'Traccar.view.edit.Maintenances',
+ 'Traccar.view.BaseWindow'
+ ],
+
+ init: function () {
+ var admin, manager, readonly;
+ admin = Traccar.app.getUser().get('administrator');
+ manager = Traccar.app.getUser().get('userLimit') !== 0;
+ readonly = Traccar.app.getPreference('readonly', false);
+ if (admin) {
+ this.lookupReference('settingsServerButton').setHidden(false);
+ this.lookupReference('settingsStatisticsButton').setHidden(false);
+ this.lookupReference('settingsComputedAttributesButton').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes'));
+ }
+ if (admin || manager) {
+ this.lookupReference('settingsUsersButton').setHidden(false);
+ }
+ if (admin || !readonly) {
+ this.lookupReference('settingsUserButton').setHidden(false);
+ this.lookupReference('settingsGroupsButton').setHidden(false);
+ this.lookupReference('settingsGeofencesButton').setHidden(false);
+ this.lookupReference('settingsNotificationsButton').setHidden(false);
+ this.lookupReference('settingsCalendarsButton').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableCalendars'));
+ this.lookupReference('settingsDriversButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers'));
+ this.lookupReference('settingsCommandsButton').setHidden(Traccar.app.getPreference('limitCommands', false));
+ this.lookupReference('settingsMaintenancesButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableMaintenance'));
+ }
+ },
+
+ onUserClick: function () {
+ var dialog = Ext.create('Traccar.view.dialog.User', {
+ selfEdit: true
+ });
+ dialog.down('form').loadRecord(Traccar.app.getUser());
+ dialog.lookupReference('testNotificationButton').setHidden(false);
+ dialog.show();
+ },
+
+ onGroupsClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.settingsGroups,
+ items: {
+ xtype: 'groupsView'
+ }
+ }).show();
+ },
+
+ onGeofencesClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedGeofences,
+ items: {
+ xtype: 'geofencesView'
+ }
+ }).show();
+ },
+
+ onServerClick: function () {
+ var dialog = Ext.create('Traccar.view.dialog.Server');
+ dialog.down('form').loadRecord(Traccar.app.getServer());
+ dialog.show();
+ },
+
+ onUsersClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.settingsUsers,
+ items: {
+ xtype: 'usersView'
+ }
+ }).show();
+ },
+
+ onNotificationsClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedNotifications,
+ items: {
+ xtype: 'notificationsView'
+ }
+ }).show();
+ },
+
+ onComputedAttributesClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedComputedAttributes,
+ items: {
+ xtype: 'computedAttributesView'
+ }
+ }).show();
+ },
+
+ onStatisticsClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.statisticsTitle,
+ items: {
+ xtype: 'statisticsView'
+ }
+ }).show();
+ },
+
+ onCalendarsClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedCalendars,
+ items: {
+ xtype: 'calendarsView'
+ }
+ }).show();
+ },
+
+ onDriversClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedDrivers,
+ items: {
+ xtype: 'driversView'
+ }
+ }).show();
+ },
+
+ onCommandsClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedSavedCommands,
+ items: {
+ xtype: 'savedCommandsView'
+ }
+ }).show();
+ },
+
+ onMaintenancesClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedMaintenance,
+ items: {
+ xtype: 'maintenancesView'
+ }
+ }).show();
+ },
+
+ onLogoutClick: function () {
+ Ext.create('Traccar.view.dialog.LoginController').logout();
+ }
+});
diff --git a/legacy/web/app/view/State.js b/legacy/web/app/view/State.js
new file mode 100644
index 00000000..c0a430d9
--- /dev/null
+++ b/legacy/web/app/view/State.js
@@ -0,0 +1,85 @@
+/*
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.State', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'stateView',
+
+ requires: [
+ 'Traccar.view.StateController'
+ ],
+
+ controller: 'state',
+ store: 'Attributes',
+
+ stateful: true,
+ stateId: 'state-grid',
+
+ tbar: {
+ componentCls: 'toolbar-header-style',
+ items: [{
+ xtype: 'tbtext',
+ html: Strings.stateTitle,
+ baseCls: 'x-panel-header-title-default'
+ }, {
+ xtype: 'tbfill'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onComputedAttributesClick',
+ reference: 'computedAttributesButton',
+ glyph: 'xf0ae@FontAwesome',
+ tooltip: Strings.sharedComputedAttributes,
+ tooltipType: 'title'
+ }]
+ },
+
+ columns: {
+ defaults: {
+ minWidth: Traccar.Style.columnWidthNormal,
+ flex: 1
+ },
+ items: [{
+ text: Strings.stateName,
+ dataIndex: 'name'
+ }, {
+ text: Strings.stateValue,
+ dataIndex: 'value',
+ cellWrap: true,
+ renderer: function (value, metaData, record) {
+ var position, device, attribute;
+ attribute = record.get('attribute');
+ if (attribute === 'alarm') {
+ metaData.tdCls = 'view-color-red';
+ } else if (attribute === 'address' && !value) {
+ return '<a href="#" onclick="Ext.fireEvent(\'stategeocode\')" >' +
+ Strings.sharedShowAddress + '</a>';
+ } 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 '<a target="_blank" href="/api/media/' +
+ device.get('uniqueId') + '/' + value + '" >' + value + '</a>';
+ }
+ }
+ }
+ return value;
+ }
+ }]
+ }
+});
diff --git a/legacy/web/app/view/StateController.js b/legacy/web/app/view/StateController.js
new file mode 100644
index 00000000..f04d7185
--- /dev/null
+++ b/legacy/web/app/view/StateController.js
@@ -0,0 +1,216 @@
+/*
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.StateController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.state',
+
+ requires: [
+ 'Traccar.AttributeFormatter',
+ 'Traccar.model.Attribute',
+ 'Traccar.model.Position',
+ 'Traccar.view.BaseWindow',
+ 'Traccar.view.edit.ComputedAttributes'
+ ],
+
+ config: {
+ listen: {
+ controller: {
+ '*': {
+ selectdevice: 'selectDevice',
+ selectreport: 'selectPosition',
+ selectevent: 'selectPosition',
+ deselectfeature: 'deselectFeature'
+ }
+ },
+ global: {
+ stategeocode: 'onGeocode'
+ },
+ store: {
+ '#LatestPositions': {
+ add: 'updateLatest',
+ update: 'updateLatest'
+ },
+ '#ReportRoute': {
+ clear: 'clearReport'
+ }
+ }
+ }
+ },
+
+ init: function () {
+ var i, hideAttributesPreference, attributesList;
+ if (Traccar.app.getUser().get('administrator') ||
+ !Traccar.app.getUser().get('deviceReadonly') && !Traccar.app.getPreference('readonly', false)) {
+ this.lookupReference('computedAttributesButton').setDisabled(
+ Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes'));
+ }
+ hideAttributesPreference = Traccar.app.getAttributePreference('ui.hidePositionAttributes');
+ this.hideAttributes = {};
+ if (hideAttributesPreference) {
+ attributesList = hideAttributesPreference.split(/[ ,]+/).filter(Boolean);
+ for (i = 0; i < attributesList.length; i++) {
+ this.hideAttributes[attributesList[i]] = true;
+ }
+ }
+ },
+
+ onComputedAttributesClick: function () {
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedComputedAttributes,
+ items: {
+ xtype: 'computedAttributesView'
+ }
+ }).show();
+ },
+
+ keys: (function () {
+ var i, list, result;
+ result = {};
+ list = ['fixTime', 'latitude', 'longitude', 'valid', 'accuracy', 'altitude', 'speed', 'course', 'address', 'protocol'];
+ for (i = 0; i < list.length; i++) {
+ result[list[i]] = {
+ priority: i,
+ name: Strings['position' + list[i].replace(/^\w/g, function (s) {
+ return s.toUpperCase();
+ })]
+ };
+ }
+ return result;
+ })(),
+
+ updateLatest: function (store, data) {
+ var i;
+ if (!Ext.isArray(data)) {
+ data = [data];
+ }
+ for (i = 0; i < data.length; i++) {
+ if (this.deviceId === data[i].get('deviceId')) {
+ this.position = data[i];
+ this.updatePosition();
+ }
+ }
+ },
+
+ formatValue: function (value) {
+ if (typeof id === 'number') {
+ return Number(value.toFixed(2));
+ } else {
+ return value;
+ }
+ },
+
+ findAttribute: function (record) {
+ return record.get('deviceId') === this.position.get('deviceId') && record.get('attribute') === this.lookupAttribute;
+ },
+
+ updatePosition: function () {
+ var attributes, store, key, name, value;
+ store = Ext.getStore('Attributes');
+ store.removeAll();
+
+ for (key in this.position.data) {
+ if (this.position.data.hasOwnProperty(key) && this.keys[key] !== undefined) {
+ 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))
+ }));
+ }
+ }
+
+ attributes = this.position.get('attributes');
+ if (attributes instanceof Object) {
+ for (key in attributes) {
+ if (attributes.hasOwnProperty(key) && !this.hideAttributes[key]) {
+ this.lookupAttribute = key;
+ name = Ext.getStore('PositionAttributes').getAttributeName(key, true);
+ if (this.position.get('attribute.' + key) !== undefined) {
+ value = Traccar.AttributeFormatter.getAttributeFormatter(key)(this.position.get('attribute.' + key));
+ } else {
+ value = Traccar.AttributeFormatter.defaultFormatter(attributes[key]);
+ }
+ store.add(Ext.create('Traccar.model.Attribute', {
+ priority: 1024,
+ name: name,
+ attribute: key,
+ value: value
+ }));
+ }
+ }
+ }
+ },
+
+ selectDevice: function (device) {
+ var position;
+ this.deviceId = device.get('id');
+ position = Ext.getStore('LatestPositions').findRecord('deviceId', this.deviceId, 0, false, false, true);
+ if (position) {
+ this.position = position;
+ this.updatePosition();
+ } else {
+ this.position = null;
+ Ext.getStore('Attributes').removeAll();
+ }
+ },
+
+ selectPosition: function (position) {
+ if (position instanceof Traccar.model.Position) {
+ this.deviceId = null;
+ this.position = position;
+ this.updatePosition();
+ }
+ },
+
+ deselectFeature: function () {
+ this.deviceId = null;
+ this.position = null;
+ Ext.getStore('Attributes').removeAll();
+ },
+
+ clearReport: function () {
+ if (!this.deviceId) {
+ this.position = null;
+ Ext.getStore('Attributes').removeAll();
+ }
+ },
+
+ onGeocode: function () {
+ var positionId = this.position.getId();
+ if (!this.position.get('address')) {
+ Ext.Ajax.request({
+ scope: this,
+ method: 'GET',
+ url: 'api/server/geocode',
+ params: {
+ latitude: this.position.get('latitude'),
+ longitude: this.position.get('longitude')
+ },
+ success: function (response) {
+ if (this.position && this.position.getId() === positionId) {
+ this.position.set('address', response.responseText);
+ this.updatePosition();
+ }
+ },
+ failure: function (response) {
+ Traccar.app.showError(response);
+ }
+ });
+ }
+ }
+});
diff --git a/legacy/web/app/view/Statistics.js b/legacy/web/app/view/Statistics.js
new file mode 100644
index 00000000..af199a02
--- /dev/null
+++ b/legacy/web/app/view/Statistics.js
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+Ext.define('Traccar.view.Statistics', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'statisticsView',
+
+ requires: [
+ 'Traccar.view.StatisticsController'
+ ],
+
+ controller: 'statistics',
+ store: 'Statistics',
+
+ tbar: {
+ scrollable: true,
+ items: [{
+ xtype: 'tbtext',
+ html: Strings.reportFrom
+ }, {
+ xtype: 'datefield',
+ reference: 'fromDateField',
+ startDay: Traccar.Style.weekStartDay,
+ format: Traccar.Style.dateFormat,
+ value: new Date(new Date().getTime() - 24 * 60 * 60 * 1000)
+ }, '-', {
+ xtype: 'tbtext',
+ html: Strings.reportTo
+ }, {
+ xtype: 'datefield',
+ reference: 'toDateField',
+ startDay: Traccar.Style.weekStartDay,
+ format: Traccar.Style.dateFormat,
+ value: new Date()
+ }, '-', {
+ text: Strings.reportShow,
+ handler: 'onShowClick'
+ }]
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.statisticsCaptureTime,
+ dataIndex: 'captureTime',
+ xtype: 'datecolumn',
+ renderer: Traccar.AttributeFormatter.defaultFormatter()
+ }, {
+ text: Strings.statisticsActiveUsers,
+ dataIndex: 'activeUsers'
+ }, {
+ text: Strings.statisticsActiveDevices,
+ dataIndex: 'activeDevices'
+ }, {
+ text: Strings.statisticsRequests,
+ dataIndex: 'requests'
+ }, {
+ text: Strings.statisticsMessagesReceived,
+ dataIndex: 'messagesReceived'
+ }, {
+ text: Strings.statisticsMessagesStored,
+ dataIndex: 'messagesStored'
+ }, {
+ text: Strings.notificatorMail,
+ dataIndex: 'mailSent'
+ }, {
+ text: Strings.notificatorSms,
+ dataIndex: 'smsSent'
+ }, {
+ text: Strings.statisticsGeocoder,
+ dataIndex: 'geocoderRequests'
+ }, {
+ text: Strings.statisticsGeolocation,
+ dataIndex: 'geolocationRequests'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/StatisticsController.js b/legacy/web/app/view/StatisticsController.js
new file mode 100644
index 00000000..c4ce9d37
--- /dev/null
+++ b/legacy/web/app/view/StatisticsController.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2016 Anton Tananaev (anton@traccar.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+Ext.define('Traccar.view.StatisticsController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.statistics',
+
+ onShowClick: function () {
+ Ext.getStore('Statistics').load({
+ params: {
+ from: this.lookupReference('fromDateField').getValue().toISOString(),
+ to: this.lookupReference('toDateField').getValue().toISOString()
+ }
+ });
+ }
+});
diff --git a/legacy/web/app/view/TouchFix62.js b/legacy/web/app/view/TouchFix62.js
new file mode 100644
index 00000000..300d4f70
--- /dev/null
+++ b/legacy/web/app/view/TouchFix62.js
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Workaround for bug in ExtJs 6.2.0.
+ * Resolved in current yet unreleased version
+ */
+
+Ext.define('Traccar.view.TouchFix62', {
+ override: 'Ext.dom.Element'
+},
+function () {
+ var additiveEvents = this.prototype.additiveEvents,
+ eventMap = this.prototype.eventMap;
+ if (Ext.supports.TouchEvents && Ext.firefoxVersion >= 52 && Ext.os.is.Desktop) {
+ eventMap['touchstart'] = 'mousedown';
+ eventMap['touchmove'] = 'mousemove';
+ eventMap['touchend'] = 'mouseup';
+ eventMap['touchcancel'] = 'mouseup';
+ eventMap['click'] = 'click';
+ eventMap['dblclick'] = 'dblclick';
+ additiveEvents['mousedown'] = 'mousedown';
+ additiveEvents['mousemove'] = 'mousemove';
+ additiveEvents['mouseup'] = 'mouseup';
+ additiveEvents['touchstart'] = 'touchstart';
+ additiveEvents['touchmove'] = 'touchmove';
+ additiveEvents['touchend'] = 'touchend';
+ additiveEvents['touchcancel'] = 'touchcancel';
+ additiveEvents['pointerdown'] = 'mousedown';
+ additiveEvents['pointermove'] = 'mousemove';
+ additiveEvents['pointerup'] = 'mouseup';
+ additiveEvents['pointercancel'] = 'mouseup';
+ }
+});
diff --git a/legacy/web/app/view/UnescapedTextAreaField.js b/legacy/web/app/view/UnescapedTextAreaField.js
new file mode 100644
index 00000000..5de267ce
--- /dev/null
+++ b/legacy/web/app/view/UnescapedTextAreaField.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2019 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.UnescapedTextAreaField', {
+ extend: 'Ext.form.field.TextArea',
+ xtype: 'unescapedTextAreaField',
+
+ initComponent: function () {
+ this.callParent();
+ this.on('change', this.onValueChange);
+ },
+
+ onValueChange: function (field, newValue) {
+ field.setValue(Ext.String.htmlDecode(newValue));
+ }
+});
diff --git a/legacy/web/app/view/UnescapedTextField.js b/legacy/web/app/view/UnescapedTextField.js
new file mode 100644
index 00000000..3b1b2798
--- /dev/null
+++ b/legacy/web/app/view/UnescapedTextField.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2019 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.UnescapedTextField', {
+ extend: 'Ext.form.field.Text',
+ xtype: 'unescapedTextField',
+
+ initComponent: function () {
+ this.callParent();
+ this.on('change', this.onValueChange);
+ },
+
+ onValueChange: function (field, newValue) {
+ field.setValue(Ext.String.htmlDecode(newValue));
+ }
+});
diff --git a/legacy/web/app/view/dialog/Attribute.js b/legacy/web/app/view/dialog/Attribute.js
new file mode 100644
index 00000000..a85cad05
--- /dev/null
+++ b/legacy/web/app/view/dialog/Attribute.js
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Attribute', {
+ extend: 'Traccar.view.dialog.Base',
+
+ requires: [
+ 'Traccar.view.dialog.AttributeController',
+ 'Traccar.view.ColorPicker',
+ 'Traccar.view.CustomNumberField',
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ controller: 'attribute',
+ title: Strings.sharedAttribute,
+
+ items: {
+ xtype: 'form',
+ listeners: {
+ validitychange: 'onValidityChange'
+ },
+ items: [{
+ xtype: 'unescapedTextField',
+ reference: 'nameTextField',
+ name: 'name',
+ allowBlank: false,
+ fieldLabel: Strings.sharedName
+ }, {
+ xtype: 'textfield',
+ name: 'value',
+ reference: 'valueField',
+ allowBlank: false,
+ fieldLabel: Strings.stateValue
+ }]
+ },
+
+ buttons: [{
+ glyph: 'xf00c@FontAwesome',
+ reference: 'saveButton',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSaveClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/AttributeController.js b/legacy/web/app/view/dialog/AttributeController.js
new file mode 100644
index 00000000..9fd452a4
--- /dev/null
+++ b/legacy/web/app/view/dialog/AttributeController.js
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.AttributeController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.attribute',
+
+ onSaveClick: function (button) {
+ var dialog, store, record;
+ dialog = button.up('window').down('form');
+ dialog.updateRecord();
+ record = dialog.getRecord();
+ store = record.store;
+ if (store) {
+ if (record.phantom) {
+ store.add(record);
+ }
+ store.sync({
+ failure: function (batch) {
+ store.rejectChanges();
+ Traccar.app.showError(batch.exceptions[0].getError().response);
+ }
+ });
+ } else {
+ record.save();
+ }
+ button.up('window').close();
+ },
+
+ onValidityChange: function (form, valid) {
+ this.lookupReference('saveButton').setDisabled(!valid);
+ },
+
+ defaultFieldConfig: {
+ name: 'value',
+ reference: 'valueField',
+ allowBlank: false,
+ fieldLabel: Strings.stateValue
+ },
+
+ onNameChange: function (combobox, newValue) {
+ var config, attribute, valueField = this.lookupReference('valueField');
+ attribute = combobox.getStore().getById(newValue);
+ if (attribute) {
+ config = Ext.clone(this.defaultFieldConfig);
+ switch (attribute.get('valueType')) {
+ case 'number':
+ config.xtype = 'customNumberField';
+ if (attribute.get('allowDecimals') !== undefined) {
+ config.allowDecimals = attribute.get('allowDecimals');
+ } else {
+ config.allowDecimals = true;
+ }
+ config.dataType = attribute.get('dataType');
+ config.maxValue = attribute.get('maxValue');
+ config.minValue = attribute.get('minValue');
+ break;
+ case 'boolean':
+ config.xtype = 'checkboxfield';
+ config.inputValue = true;
+ config.uncheckedValue = false;
+ break;
+ case 'color':
+ config.xtype = 'customcolorpicker';
+ break;
+ default:
+ if (attribute.get('dataType')) {
+ config.xtype = 'combobox';
+ config.queryMode = 'local';
+ config.editable = false;
+ switch (attribute.get('dataType')) {
+ case 'distanceUnit':
+ config.store = 'DistanceUnits';
+ config.displayField = 'name';
+ config.valueField = 'key';
+ break;
+ case 'speedUnit':
+ config.store = 'SpeedUnits';
+ config.displayField = 'name';
+ config.valueField = 'key';
+ break;
+ case 'volumeUnit':
+ config.store = 'VolumeUnits';
+ config.displayField = 'fullName';
+ config.valueField = 'key';
+ break;
+ case 'timezone':
+ config.store = 'AllTimezones';
+ config.displayField = 'key';
+ break;
+ default:
+ break;
+ }
+ } else {
+ config.xtype = 'textfield';
+ }
+ break;
+ }
+ if (valueField.getXType() !== config.xtype ||
+ config.xtype === 'customNumberField' && valueField.dataType !== config.dataType) {
+ this.getView().down('form').insert(this.getView().down('form').items.indexOf(valueField), config);
+ this.getView().down('form').remove(valueField);
+ } else if (config.xtype === 'customNumberField') {
+ valueField.setConfig(config);
+ valueField.validate();
+ } else if (config.xtype === 'combobox') {
+ valueField.setConfig(config);
+ valueField.setValue();
+ }
+ }
+ }
+});
diff --git a/legacy/web/app/view/dialog/Base.js b/legacy/web/app/view/dialog/Base.js
new file mode 100644
index 00000000..6affb370
--- /dev/null
+++ b/legacy/web/app/view/dialog/Base.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Base', {
+ extend: 'Ext.window.Window',
+
+ bodyPadding: Traccar.Style.normalPadding,
+ resizable: false,
+ scrollable: true,
+ constrain: true,
+
+ initComponent: function () {
+ if (window.innerHeight) {
+ this.maxHeight = window.innerHeight - Traccar.Style.normalPadding * 2;
+ }
+ this.callParent();
+ }
+});
diff --git a/legacy/web/app/view/dialog/BaseEdit.js b/legacy/web/app/view/dialog/BaseEdit.js
new file mode 100644
index 00000000..286afba5
--- /dev/null
+++ b/legacy/web/app/view/dialog/BaseEdit.js
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.BaseEdit', {
+ extend: 'Traccar.view.dialog.Base',
+
+ requires: [
+ 'Traccar.view.dialog.BaseEditController'
+ ],
+
+ controller: 'baseEdit',
+
+ buttons: [{
+ text: Strings.sharedAttributes,
+ handler: 'showAttributesView'
+ }, {
+ xtype: 'tbfill'
+ }, {
+ glyph: 'xf00c@FontAwesome',
+ reference: 'saveButton',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSaveClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/BaseEditController.js b/legacy/web/app/view/dialog/BaseEditController.js
new file mode 100644
index 00000000..91379e2d
--- /dev/null
+++ b/legacy/web/app/view/dialog/BaseEditController.js
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.BaseEditController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.baseEdit',
+
+ requires: [
+ 'Traccar.view.BaseWindow',
+ 'Traccar.view.edit.Attributes'
+ ],
+
+ onSaveClick: function (button) {
+ var dialog, store, record;
+ dialog = button.up('window').down('form');
+ dialog.updateRecord();
+ record = dialog.getRecord();
+ store = record.store;
+ if (store) {
+ if (record.phantom) {
+ store.add(record);
+ }
+ store.sync({
+ failure: function (batch) {
+ store.rejectChanges();
+ Traccar.app.showError(batch.exceptions[0].getError().response);
+ }
+ });
+ } else {
+ record.save();
+ }
+ this.closeView();
+ },
+
+ showAttributesView: function (button) {
+ var dialog, record;
+ dialog = button.up('window').down('form');
+ record = dialog.getRecord();
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedAttributes,
+ items: {
+ xtype: 'attributesView',
+ record: record
+ }
+ }).show();
+ }
+});
diff --git a/legacy/web/app/view/dialog/Calendar.js b/legacy/web/app/view/dialog/Calendar.js
new file mode 100644
index 00000000..5f00a8be
--- /dev/null
+++ b/legacy/web/app/view/dialog/Calendar.js
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Calendar', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.dialog.CalendarController',
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ controller: 'calendar',
+ title: Strings.sharedCalendar,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'name',
+ fieldLabel: Strings.sharedName,
+ allowBlank: false
+ }, {
+ xtype: 'filefield',
+ name: 'file',
+ fieldLabel: Strings.sharedFile,
+ allowBlank: false,
+ buttonConfig: {
+ glyph: 'xf093@FontAwesome',
+ text: '',
+ tooltip: Strings.sharedSelectFile,
+ tooltipType: 'title',
+ minWidth: 0
+ },
+ listeners: {
+ change: 'onFileChange'
+ }
+ }]
+ }, {
+ xtype: 'hiddenfield',
+ name: 'data',
+ allowBlank: false,
+ reference: 'dataField'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/dialog/CalendarController.js b/legacy/web/app/view/dialog/CalendarController.js
new file mode 100644
index 00000000..fb8cbff6
--- /dev/null
+++ b/legacy/web/app/view/dialog/CalendarController.js
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.CalendarController', {
+ extend: 'Traccar.view.dialog.BaseEditController',
+ alias: 'controller.calendar',
+
+ onFileChange: function (fileField) {
+ var reader;
+ if (fileField.fileInputEl.dom.files.length > 0) {
+ reader = new FileReader();
+ reader.onload = function (event) {
+ fileField.up('window').lookupReference('dataField').setValue(
+ event.target.result.substr(event.target.result.indexOf(',') + 1));
+ };
+ reader.onerror = function (event) {
+ Traccar.app.showError(event.target.error);
+ };
+ reader.readAsDataURL(fileField.fileInputEl.dom.files[0]);
+ }
+ }
+});
diff --git a/legacy/web/app/view/dialog/ComputedAttribute.js b/legacy/web/app/view/dialog/ComputedAttribute.js
new file mode 100644
index 00000000..adae7f7b
--- /dev/null
+++ b/legacy/web/app/view/dialog/ComputedAttribute.js
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.ComputedAttribute', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.dialog.ComputedAttributeController',
+ 'Traccar.view.UnescapedTextField',
+ 'Traccar.view.UnescapedTextAreaField'
+ ],
+
+ controller: 'computedAttribute',
+ title: Strings.sharedComputedAttribute,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'description',
+ fieldLabel: Strings.sharedDescription
+ }, {
+ xtype: 'combobox',
+ name: 'attribute',
+ fieldLabel: Strings.sharedAttribute,
+ store: 'PositionAttributes',
+ displayField: 'name',
+ valueField: 'key',
+ listeners: {
+ change: 'onAttributeChange'
+ }
+ }, {
+ xtype: 'unescapedTextAreaField',
+ reference: 'expressionField',
+ name: 'expression',
+ fieldLabel: Strings.sharedExpression,
+ allowBlank: false
+ }, {
+ xtype: 'combobox',
+ name: 'type',
+ reference: 'typeComboField',
+ store: 'AttributeValueTypes',
+ fieldLabel: Strings.sharedType,
+ displayField: 'name',
+ valueField: 'id',
+ editable: false
+ }]
+ },
+
+ buttons: [{
+ glyph: 'xf128@FontAwesome',
+ tooltip: Strings.sharedCheckComputedAttribute,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onCheckClick'
+ }, {
+ glyph: 'xf00c@FontAwesome',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSaveClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/ComputedAttributeController.js b/legacy/web/app/view/dialog/ComputedAttributeController.js
new file mode 100644
index 00000000..f680b1b5
--- /dev/null
+++ b/legacy/web/app/view/dialog/ComputedAttributeController.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.ComputedAttributeController', {
+ extend: 'Traccar.view.dialog.BaseEditController',
+ alias: 'controller.computedAttribute',
+
+ requires: [
+ 'Traccar.view.dialog.SelectDevice'
+ ],
+
+ onAttributeChange: function (combobox, newValue) {
+ var attribute = Ext.getStore('PositionAttributes').getById(newValue);
+ if (attribute) {
+ this.getView().lookupReference('typeComboField').setValue(attribute.get('valueType'));
+ this.getView().lookupReference('typeComboField').setReadOnly(true);
+ } else {
+ this.getView().lookupReference('typeComboField').setReadOnly(false);
+ }
+ },
+
+ onCheckClick: function (button) {
+ var dialog, form;
+ dialog = Ext.create('Traccar.view.dialog.SelectDevice');
+ form = button.up('window').down('form');
+ form.updateRecord();
+ dialog.record = form.getRecord();
+ dialog.show();
+ }
+});
diff --git a/legacy/web/app/view/dialog/Device.js b/legacy/web/app/view/dialog/Device.js
new file mode 100644
index 00000000..60a8f716
--- /dev/null
+++ b/legacy/web/app/view/dialog/Device.js
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Device', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.ClearableComboBox',
+ 'Traccar.view.dialog.DeviceController',
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ controller: 'device',
+ title: Strings.sharedDevice,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'name',
+ fieldLabel: Strings.sharedName,
+ allowBlank: false
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'uniqueId',
+ fieldLabel: Strings.deviceIdentifier,
+ allowBlank: false
+ }]
+ }, {
+ xtype: 'fieldset',
+ title: Strings.sharedExtra,
+ collapsible: true,
+ collapsed: true,
+ items: [{
+ xtype: 'clearableComboBox',
+ name: 'groupId',
+ fieldLabel: Strings.groupParent,
+ store: 'Groups',
+ queryMode: 'local',
+ displayField: 'name',
+ valueField: 'id'
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'phone',
+ fieldLabel: Strings.sharedPhone
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'model',
+ fieldLabel: Strings.deviceModel
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'contact',
+ fieldLabel: Strings.deviceContact
+ }, {
+ xtype: 'combobox',
+ name: 'category',
+ fieldLabel: Strings.deviceCategory,
+ store: 'DeviceImages',
+ queryMode: 'local',
+ displayField: 'name',
+ valueField: 'key',
+ editable: false,
+ listConfig: {
+ getInnerTpl: function () {
+ return '<table><tr valign="middle" ><td><div align="center" style="width:40px;height:40px;" >' +
+ '{[new XMLSerializer().serializeToString(Traccar.DeviceImages.getImageSvg(' +
+ 'Traccar.Style.mapColorOnline, false, 0, values.key))]}</div></td>' +
+ '<td>{name}</td></tr></table>';
+ }
+ }
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'disabled',
+ fieldLabel: Strings.sharedDisabled,
+ hidden: true,
+ reference: 'disabledField'
+ }]
+ }]
+ }
+});
diff --git a/legacy/web/app/view/dialog/DeviceAccumulators.js b/legacy/web/app/view/dialog/DeviceAccumulators.js
new file mode 100644
index 00000000..eaa4e9f5
--- /dev/null
+++ b/legacy/web/app/view/dialog/DeviceAccumulators.js
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.DeviceAccumulators', {
+ extend: 'Traccar.view.dialog.Base',
+
+ requires: [
+ 'Traccar.view.dialog.DeviceAccumulatorsController'
+ ],
+
+ controller: 'deviceAccumulators',
+ title: Strings.sharedDeviceAccumulators,
+
+ items: [{
+ xtype: 'customNumberField',
+ dataType: 'distance',
+ reference: 'totalDistance',
+ fieldLabel: Strings.deviceTotalDistance
+ }, {
+ xtype: 'customNumberField',
+ dataType: 'hours',
+ reference: 'hours',
+ fieldLabel: Strings.positionHours
+ }],
+
+ buttons: [{
+ reference: 'setButton',
+ glyph: 'xf00c@FontAwesome',
+ tooltip: Strings.sharedSet,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSetClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/DeviceAccumulatorsController.js b/legacy/web/app/view/dialog/DeviceAccumulatorsController.js
new file mode 100644
index 00000000..2fdae6c5
--- /dev/null
+++ b/legacy/web/app/view/dialog/DeviceAccumulatorsController.js
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2016 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.DeviceAccumulatorsController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.deviceAccumulators',
+
+ onSetClick: function () {
+ var totalDistance, hours, data = {
+ deviceId: this.getView().deviceId
+ };
+ totalDistance = this.lookupReference('totalDistance');
+ if (!isNaN(totalDistance.getRawValue())) {
+ data.totalDistance = totalDistance.getValue();
+ }
+ hours = this.lookupReference('hours');
+ if (!isNaN(hours.getRawValue())) {
+ data.hours = hours.getValue();
+ }
+ Ext.Ajax.request({
+ scope: this,
+ method: 'PUT',
+ url: 'api/devices/' + data.deviceId + '/accumulators',
+ jsonData: Ext.util.JSON.encode(data),
+ callback: function (options, success, response) {
+ if (!success) {
+ Traccar.app.showError(response);
+ }
+ }
+ });
+ this.closeView();
+ }
+});
diff --git a/legacy/web/app/view/dialog/DeviceController.js b/legacy/web/app/view/dialog/DeviceController.js
new file mode 100644
index 00000000..d7a4493b
--- /dev/null
+++ b/legacy/web/app/view/dialog/DeviceController.js
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.DeviceController', {
+ extend: 'Traccar.view.dialog.BaseEditController',
+ alias: 'controller.device',
+
+ init: function () {
+ if (Traccar.app.getUser().get('administrator')) {
+ this.lookupReference('disabledField').setHidden(false);
+ }
+ }
+
+});
diff --git a/legacy/web/app/view/dialog/Driver.js b/legacy/web/app/view/dialog/Driver.js
new file mode 100644
index 00000000..9b1c17b5
--- /dev/null
+++ b/legacy/web/app/view/dialog/Driver.js
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Driver', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ title: Strings.sharedDriver,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'name',
+ fieldLabel: Strings.sharedName,
+ allowBlank: false
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'uniqueId',
+ fieldLabel: Strings.deviceIdentifier,
+ allowBlank: false
+ }]
+ }]
+ }
+});
diff --git a/legacy/web/app/view/dialog/Geofence.js b/legacy/web/app/view/dialog/Geofence.js
new file mode 100644
index 00000000..1e22cd7b
--- /dev/null
+++ b/legacy/web/app/view/dialog/Geofence.js
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Geofence', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.ClearableComboBox',
+ 'Traccar.view.dialog.GeofenceController',
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ controller: 'geofence',
+ title: Strings.sharedGeofence,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'name',
+ fieldLabel: Strings.sharedName
+ }]
+ }, {
+ xtype: 'fieldset',
+ title: Strings.sharedExtra,
+ collapsible: true,
+ collapsed: true,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'description',
+ fieldLabel: Strings.sharedDescription
+ }, {
+ xtype: 'clearableComboBox',
+ reference: 'calendarCombo',
+ name: 'calendarId',
+ store: 'Calendars',
+ queryMode: 'local',
+ displayField: 'name',
+ valueField: 'id',
+ fieldLabel: Strings.sharedCalendar
+ }, {
+ xtype: 'hiddenfield',
+ name: 'area',
+ allowBlank: false,
+ reference: 'areaField'
+ }]
+ }]
+ },
+
+ buttons: [{
+ text: Strings.sharedArea,
+ glyph: 'xf21d@FontAwesome',
+ handler: 'onAreaClick'
+ }, {
+ text: Strings.sharedAttributes,
+ handler: 'showAttributesView'
+ }, {
+ xtype: 'tbfill'
+ }, {
+ glyph: 'xf00c@FontAwesome',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSaveClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/GeofenceController.js b/legacy/web/app/view/dialog/GeofenceController.js
new file mode 100644
index 00000000..e4ac5a2e
--- /dev/null
+++ b/legacy/web/app/view/dialog/GeofenceController.js
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.GeofenceController', {
+ extend: 'Traccar.view.dialog.BaseEditController',
+ alias: 'controller.geofence',
+
+ requires: [
+ 'Traccar.view.BaseWindow',
+ 'Traccar.view.map.GeofenceMap'
+ ],
+
+ config: {
+ listen: {
+ controller: {
+ '*': {
+ savearea: 'saveArea'
+ }
+ }
+ }
+ },
+
+ init: function () {
+ this.lookupReference('calendarCombo').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableCalendars'));
+ },
+
+ saveArea: function (value) {
+ this.lookupReference('areaField').setValue(value);
+ },
+
+ onAreaClick: function (button) {
+ var dialog, record;
+ dialog = button.up('window').down('form');
+ record = dialog.getRecord();
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedArea,
+ items: {
+ xtype: 'geofenceMapView',
+ area: record.get('area')
+ }
+ }).show();
+ }
+});
diff --git a/legacy/web/app/view/dialog/Group.js b/legacy/web/app/view/dialog/Group.js
new file mode 100644
index 00000000..61ca193d
--- /dev/null
+++ b/legacy/web/app/view/dialog/Group.js
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Group', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.ClearableComboBox',
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ title: Strings.groupDialog,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'name',
+ fieldLabel: Strings.sharedName,
+ allowBlank: false
+ }]
+ }, {
+ xtype: 'fieldset',
+ title: Strings.sharedExtra,
+ collapsible: true,
+ collapsed: true,
+ items: [{
+ xtype: 'clearableComboBox',
+ name: 'groupId',
+ fieldLabel: Strings.groupParent,
+ store: 'Groups',
+ queryMode: 'local',
+ displayField: 'name',
+ valueField: 'id'
+ }]
+ }]
+ }
+});
diff --git a/legacy/web/app/view/dialog/Login.js b/legacy/web/app/view/dialog/Login.js
new file mode 100644
index 00000000..592efb33
--- /dev/null
+++ b/legacy/web/app/view/dialog/Login.js
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2015 - 2023 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Login', {
+ extend: 'Traccar.view.dialog.Base',
+ alias: 'widget.login',
+
+ requires: [
+ 'Traccar.view.dialog.LoginController'
+ ],
+
+ controller: 'login',
+
+ header: false,
+ closable: false,
+
+ items: {
+ xtype: 'form',
+ reference: 'form',
+
+ autoEl: {
+ tag: 'form',
+ method: 'POST',
+ action: 'fake-login.html',
+ target: 'submitTarget'
+ },
+
+ items: [{
+ xtype: 'image',
+ src: 'logo.svg',
+ alt: Strings.loginLogo,
+ width: 240,
+ height: 64,
+ style: {
+ 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',
+ fieldLabel: Strings.loginLanguage,
+ store: 'Languages',
+ displayField: 'name',
+ valueField: 'code',
+ editable: false,
+ submitValue: false,
+ listeners: {
+ select: 'onSelectLanguage'
+ },
+ reference: 'languageField'
+ }, {
+ xtype: 'textfield',
+ name: 'email',
+ reference: 'userField',
+ fieldLabel: Strings.userEmail,
+ allowBlank: false,
+ enableKeyEvents: true,
+ listeners: {
+ specialKey: 'onSpecialKey',
+ afterrender: 'onAfterRender'
+ },
+ inputAttrTpl: ['autocomplete="on" autocapitalize="none"']
+ }, {
+ xtype: 'textfield',
+ name: 'password',
+ reference: 'passwordField',
+ fieldLabel: Strings.userPassword,
+ inputType: 'password',
+ allowBlank: false,
+ enableKeyEvents: true,
+ listeners: {
+ specialKey: 'onSpecialKey'
+ },
+ inputAttrTpl: ['autocomplete="on"']
+ }, {
+ xtype: 'component',
+ html: '<iframe id="submitTarget" name="submitTarget" style="display:none"></iframe>'
+ }, {
+ xtype: 'component',
+ html: '<input type="submit" id="submitButton" style="display:none">'
+ }]
+ },
+
+ buttons: [{
+ text: Strings.loginReset,
+ handler: 'onResetClick',
+ reference: 'resetButton'
+ }, {
+ text: Strings.loginRegister,
+ handler: 'onRegisterClick',
+ reference: 'registerButton'
+ }, {
+ text: Strings.loginLogin,
+ handler: 'onLoginClick'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/LoginController.js b/legacy/web/app/view/dialog/LoginController.js
new file mode 100644
index 00000000..a21866eb
--- /dev/null
+++ b/legacy/web/app/view/dialog/LoginController.js
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2015 - 2023 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.LoginController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.login',
+
+ requires: [
+ 'Traccar.view.dialog.Register'
+ ],
+
+ init: function () {
+ this.lookupReference('resetButton').setHidden(!Traccar.app.getServer().get('emailEnabled'));
+ this.lookupReference('registerButton').setDisabled(!Traccar.app.getServer().get('registration'));
+ this.lookupReference('languageField').setValue(Locale.language);
+ },
+
+ login: function () {
+ var form = this.lookupReference('form');
+ if (form.isValid()) {
+ Ext.get('spinner').setVisible(true);
+ this.getView().setVisible(false);
+ Ext.Ajax.request({
+ scope: this,
+ method: 'POST',
+ url: 'api/session',
+ params: form.getValues(),
+ callback: function (options, success, response) {
+ Ext.get('spinner').setVisible(false);
+ if (success) {
+ Traccar.app.setUser(Ext.decode(response.responseText));
+ this.fireViewEvent('login');
+ } else {
+ this.getView().setVisible(true);
+ if (response.status === 401) {
+ Traccar.app.showError(Strings.loginFailed);
+ } else {
+ Traccar.app.showError(response.responseText);
+ }
+ }
+ }
+ });
+ }
+ },
+
+ logout: function () {
+ Ext.util.Cookies.clear('user');
+ Ext.util.Cookies.clear('password');
+ Ext.Ajax.request({
+ scope: this,
+ method: 'DELETE',
+ url: 'api/session',
+ callback: function () {
+ window.location.reload();
+ }
+ });
+ },
+
+ onSelectLanguage: function (selected) {
+ var paramName, paramValue, url, prefix, suffix;
+ paramName = 'locale';
+ paramValue = selected.getValue();
+ url = window.location.href;
+ if (url.indexOf(paramName + '=') >= 0) {
+ prefix = url.substring(0, url.indexOf(paramName));
+ suffix = url.substring(url.indexOf(paramName));
+ suffix = suffix.substring(suffix.indexOf('=') + 1);
+ suffix = suffix.indexOf('&') >= 0 ? suffix.substring(suffix.indexOf('&')) : '';
+ url = prefix + paramName + '=' + paramValue + suffix;
+ } else if (url.indexOf('?') < 0) {
+ url += '?' + paramName + '=' + paramValue;
+ } else {
+ url += '&' + paramName + '=' + paramValue;
+ }
+ window.location.href = url;
+ },
+
+ onAfterRender: function (field) {
+ field.focus();
+ },
+
+ onSpecialKey: function (field, e) {
+ if (e.getKey() === e.ENTER) {
+ this.login();
+ }
+ },
+
+ onLoginClick: function () {
+ Ext.getElementById('submitButton').click();
+ this.login();
+ },
+
+ onRegisterClick: function () {
+ Ext.create('Traccar.view.dialog.Register').show();
+ },
+
+ onResetClick: function () {
+ Ext.Msg.prompt(Strings.loginReset, Strings.userEmail, function (btn, text) {
+ if (btn === 'ok') {
+ Ext.Ajax.request({
+ scope: this,
+ method: 'POST',
+ url: 'api/password/reset',
+ params: {
+ email: text
+ },
+ callback: function (options, success, response) {
+ if (success) {
+ Traccar.app.showToast(Strings.loginResetSuccess);
+ } else {
+ Traccar.app.showError(response.responseText);
+ }
+ }
+ });
+ }
+ });
+ }
+});
diff --git a/legacy/web/app/view/dialog/Maintenance.js b/legacy/web/app/view/dialog/Maintenance.js
new file mode 100644
index 00000000..d844d259
--- /dev/null
+++ b/legacy/web/app/view/dialog/Maintenance.js
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Maintenance', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.dialog.MaintenanceController',
+ 'Traccar.view.CustomNumberField',
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ controller: 'maintenance',
+
+ title: Strings.sharedMaintenance,
+
+ items: {
+ xtype: 'form',
+ listeners: {
+ validitychange: 'onValidityChange'
+ },
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'name',
+ fieldLabel: Strings.sharedName,
+ allowBlank: false
+ }, {
+ xtype: 'combobox',
+ name: 'type',
+ reference: 'typeComboField',
+ fieldLabel: Strings.sharedType,
+ displayField: 'name',
+ valueField: 'key',
+ allowBlank: false,
+ queryMode: 'local',
+ store: 'MaintenanceTypes',
+ listeners: {
+ change: 'onNameChange'
+ }
+ }, {
+ xtype: 'customNumberField',
+ name: 'start',
+ reference: 'startField',
+ fieldLabel: Strings.maintenanceStart
+ }, {
+ xtype: 'customNumberField',
+ name: 'period',
+ reference: 'periodField',
+ allowBlank: false,
+ fieldLabel: Strings.maintenancePeriod,
+ validator: function (value) {
+ return this.parseValue(value) !== 0 ? true : Strings.errorZero;
+ }
+ }]
+ }]
+ }
+});
diff --git a/legacy/web/app/view/dialog/MaintenanceController.js b/legacy/web/app/view/dialog/MaintenanceController.js
new file mode 100644
index 00000000..d5a27b54
--- /dev/null
+++ b/legacy/web/app/view/dialog/MaintenanceController.js
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.MaintenanceController', {
+ extend: 'Traccar.view.dialog.BaseEditController',
+ alias: 'controller.maintenance',
+
+ init: function () {
+ this.startConfig = Ext.clone(this.lookupReference('startField').initialConfig);
+ this.startConfig.value = 0;
+ this.periodConfig = Ext.clone(this.lookupReference('periodField').initialConfig);
+ this.periodConfig.value = 0;
+ this.lookupReference('saveButton').setDisabled(true);
+ },
+
+ onValidityChange: function (form, valid) {
+ this.lookupReference('saveButton').setDisabled(!valid);
+ },
+
+ updateFieldConfig: function (fieldReference, initialConfig, newConfig) {
+ var field = this.lookupReference(fieldReference);
+ if (field.dataType !== newConfig.dataType) {
+ this.getView().down('fieldset').insert(this.getView().down('fieldset').items.indexOf(field),
+ Ext.merge({}, initialConfig, newConfig));
+ this.getView().down('fieldset').remove(field);
+ this.lookupReference(fieldReference).validate();
+ } else {
+ field.setConfig(newConfig);
+ field.validate();
+ }
+ },
+
+ onNameChange: function (combobox, newValue) {
+ var attribute, config = {};
+ attribute = combobox.getStore().getById(newValue);
+ if (attribute) {
+ if (attribute.get('allowDecimals') !== undefined) {
+ config.allowDecimals = attribute.get('allowDecimals');
+ } else {
+ config.allowDecimals = true;
+ }
+ config.dataType = attribute.get('dataType');
+ config.maxValue = attribute.get('maxValue');
+ config.minValue = attribute.get('minValue');
+ }
+
+ this.updateFieldConfig('startField', this.startConfig, config);
+ this.updateFieldConfig('periodField', this.periodConfig, config);
+ }
+});
diff --git a/legacy/web/app/view/dialog/MapPickerController.js b/legacy/web/app/view/dialog/MapPickerController.js
new file mode 100644
index 00000000..8641e377
--- /dev/null
+++ b/legacy/web/app/view/dialog/MapPickerController.js
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.MapPickerController', {
+ extend: 'Traccar.view.dialog.BaseEditController',
+ alias: 'controller.mapPicker',
+
+ config: {
+ listen: {
+ controller: {
+ '*': {
+ mapstate: 'setMapState'
+ }
+ }
+ }
+ },
+
+ getMapState: function () {
+ this.fireEvent('mapstaterequest');
+ },
+
+ setMapState: function (lat, lon, zoom) {
+ this.lookupReference('latitude').setValue(lat);
+ this.lookupReference('longitude').setValue(lon);
+ this.lookupReference('zoom').setValue(zoom);
+ }
+});
diff --git a/legacy/web/app/view/dialog/Notification.js b/legacy/web/app/view/dialog/Notification.js
new file mode 100644
index 00000000..51af5b8e
--- /dev/null
+++ b/legacy/web/app/view/dialog/Notification.js
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Notification', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.ClearableComboBox',
+ 'Traccar.view.dialog.NotificationController'
+ ],
+
+ controller: 'notification',
+ title: Strings.sharedNotification,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'combobox',
+ name: 'type',
+ fieldLabel: Strings.sharedType,
+ store: 'AllNotificationTypes',
+ queryMode: 'local',
+ displayField: 'name',
+ valueField: 'type',
+ editable: false,
+ allowBlank: false,
+ listeners: {
+ change: 'onTypeChange'
+ }
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'always',
+ fieldLabel: Strings.notificationAlways
+ }, {
+ xtype: 'tagfield',
+ reference: 'alarmsField',
+ fieldLabel: Strings.sharedAlarms,
+ maxWidth: Traccar.Style.formFieldWidth,
+ store: 'AlarmTypes',
+ valueField: 'key',
+ displayField: 'name',
+ queryMode: 'local',
+ hidden: true,
+ listeners: {
+ beforerender: 'onAlarmsLoad',
+ change: 'onAlarmsChange'
+ }
+ }, {
+ xtype: 'tagfield',
+ fieldLabel: Strings.notificationNotificators,
+ name: 'notificators',
+ maxWidth: Traccar.Style.formFieldWidth,
+ store: 'AllNotificators',
+ valueField: 'type',
+ displayField: 'name',
+ queryMode: 'local'
+ }]
+ }, {
+ xtype: 'fieldset',
+ title: Strings.sharedExtra,
+ collapsible: true,
+ collapsed: true,
+ items: [{
+ xtype: 'clearableComboBox',
+ reference: 'calendarCombo',
+ name: 'calendarId',
+ store: 'Calendars',
+ queryMode: 'local',
+ displayField: 'name',
+ valueField: 'id',
+ fieldLabel: Strings.sharedCalendar
+ }]
+ }]
+ }
+});
diff --git a/legacy/web/app/view/dialog/NotificationController.js b/legacy/web/app/view/dialog/NotificationController.js
new file mode 100644
index 00000000..5da669a4
--- /dev/null
+++ b/legacy/web/app/view/dialog/NotificationController.js
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.NotificationController', {
+ extend: 'Traccar.view.dialog.BaseEditController',
+ alias: 'controller.notification',
+
+ init: function () {
+ this.lookupReference('calendarCombo').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableCalendars'));
+ },
+
+ onTypeChange: function (view, value) {
+ this.lookupReference('alarmsField').setHidden(value !== 'alarm');
+ },
+
+ onAlarmsLoad: function (view) {
+ var attributes, record = view.up('form').getRecord();
+ attributes = record.get('attributes') || {};
+ if (attributes['alarms']) {
+ view.suspendEvents(false);
+ view.setValue(attributes['alarms'].split(','));
+ view.resumeEvents();
+ }
+ },
+
+ onAlarmsChange: function (view, value) {
+ var attributes, record = view.up('window').down('form').getRecord();
+ attributes = record.get('attributes') || {};
+
+ value = value.join();
+ if (attributes['alarms'] !== value) {
+ attributes['alarms'] = value;
+ record.set('attributes', attributes);
+ record.dirty = true;
+ }
+ }
+});
diff --git a/legacy/web/app/view/dialog/Register.js b/legacy/web/app/view/dialog/Register.js
new file mode 100644
index 00000000..f9608cef
--- /dev/null
+++ b/legacy/web/app/view/dialog/Register.js
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Register', {
+ extend: 'Traccar.view.dialog.Base',
+
+ requires: [
+ 'Traccar.view.dialog.RegisterController'
+ ],
+
+ controller: 'register',
+
+ title: Strings.loginRegister,
+
+ items: {
+ xtype: 'form',
+ reference: 'form',
+ jsonSubmit: true,
+
+ items: [{
+ xtype: 'textfield',
+ name: 'name',
+ fieldLabel: Strings.sharedName,
+ allowBlank: false
+ }, {
+ xtype: 'textfield',
+ name: 'email',
+ fieldLabel: Strings.userEmail,
+ validator: function (val) {
+ if (/(.+)@(.+)\.(.{2,})/.test(val)) {
+ return true;
+ } else {
+ return Ext.form.field.VTypes.emailText;
+ }
+ },
+ allowBlank: false
+ }, {
+ xtype: 'textfield',
+ name: 'password',
+ fieldLabel: Strings.userPassword,
+ inputType: 'password',
+ allowBlank: false
+ }]
+ },
+
+ buttons: [{
+ text: Strings.sharedSave,
+ handler: 'onCreateClick'
+ }, {
+ text: Strings.sharedCancel,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/RegisterController.js b/legacy/web/app/view/dialog/RegisterController.js
new file mode 100644
index 00000000..c102581e
--- /dev/null
+++ b/legacy/web/app/view/dialog/RegisterController.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.RegisterController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.register',
+
+ onCreateClick: function () {
+ var form = this.lookupReference('form');
+ if (form.isValid()) {
+ Ext.Ajax.request({
+ scope: this,
+ method: 'POST',
+ url: 'api/users',
+ jsonData: form.getValues(),
+ callback: this.onCreateReturn
+ });
+ }
+ },
+
+ onCreateReturn: function (options, success, response) {
+ if (success) {
+ this.closeView();
+ Traccar.app.showToast(Strings.loginCreated);
+ } else {
+ Traccar.app.showError(response);
+ }
+ }
+
+});
diff --git a/legacy/web/app/view/dialog/ReportConfig.js b/legacy/web/app/view/dialog/ReportConfig.js
new file mode 100644
index 00000000..35cc95b4
--- /dev/null
+++ b/legacy/web/app/view/dialog/ReportConfig.js
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.ReportConfig', {
+ extend: 'Traccar.view.dialog.Base',
+
+ requires: [
+ 'Traccar.view.dialog.ReportConfigController',
+ 'Traccar.view.CustomTimeField'
+ ],
+
+ controller: 'reportConfig',
+ title: Strings.reportConfigure,
+
+ items: [{
+ fieldLabel: Strings.reportDevice,
+ xtype: 'tagfield',
+ reference: 'deviceField',
+ maxWidth: Traccar.Style.formFieldWidth,
+ store: 'Devices',
+ valueField: 'id',
+ displayField: 'name',
+ queryMode: 'local'
+ }, {
+ fieldLabel: Strings.reportGroup,
+ xtype: 'tagfield',
+ reference: 'groupField',
+ maxWidth: Traccar.Style.formFieldWidth,
+ store: 'Groups',
+ valueField: 'id',
+ displayField: 'name',
+ queryMode: 'local'
+ }, {
+ fieldLabel: Strings.reportEventTypes,
+ xtype: 'tagfield',
+ reference: 'eventTypeField',
+ maxWidth: Traccar.Style.formFieldWidth,
+ store: 'ReportEventTypes',
+ hidden: true,
+ valueField: 'type',
+ displayField: 'name',
+ queryMode: 'local'
+ }, {
+ fieldLabel: Strings.reportChartType,
+ xtype: 'combobox',
+ reference: 'chartTypeField',
+ store: 'ReportChartTypes',
+ hidden: true,
+ value: 'speed',
+ valueField: 'key',
+ displayField: 'name',
+ queryMode: 'local'
+ }, {
+ fieldLabel: Strings.reportShowMarkers,
+ xtype: 'checkbox',
+ reference: 'showMarkersField',
+ inputValue: true,
+ uncheckedValue: false,
+ value: false
+ }, {
+ fieldLabel: Strings.reportPeriod,
+ reference: 'periodField',
+ xtype: 'combobox',
+ store: 'ReportPeriods',
+ editable: false,
+ valueField: 'key',
+ displayField: 'name',
+ queryMode: 'local',
+ listeners: {
+ change: 'onPeriodChange'
+ }
+ }, {
+ xtype: 'fieldcontainer',
+ layout: 'vbox',
+ reference: 'fromContainer',
+ hidden: true,
+ fieldLabel: Strings.reportFrom,
+ items: [{
+ xtype: 'datefield',
+ reference: 'fromDateField',
+ startDay: Traccar.Style.weekStartDay,
+ format: Traccar.Style.dateFormat,
+ value: new Date(new Date().getTime() - 30 * 60 * 1000)
+ }, {
+ xtype: 'customTimeField',
+ reference: 'fromTimeField',
+ value: new Date(new Date().getTime() - 30 * 60 * 1000)
+ }]
+ }, {
+ xtype: 'fieldcontainer',
+ layout: 'vbox',
+ reference: 'toContainer',
+ hidden: true,
+ fieldLabel: Strings.reportTo,
+ items: [{
+ xtype: 'datefield',
+ reference: 'toDateField',
+ startDay: Traccar.Style.weekStartDay,
+ format: Traccar.Style.dateFormat,
+ value: new Date()
+ }, {
+ xtype: 'customTimeField',
+ reference: 'toTimeField',
+ value: new Date()
+ }]
+ }],
+
+ buttons: [{
+ glyph: 'xf00c@FontAwesome',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSaveClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/ReportConfigController.js b/legacy/web/app/view/dialog/ReportConfigController.js
new file mode 100644
index 00000000..6d029428
--- /dev/null
+++ b/legacy/web/app/view/dialog/ReportConfigController.js
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.ReportConfigController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.reportConfig',
+
+ requires: [
+ 'Traccar.store.ReportEventTypes',
+ 'Traccar.store.AllNotifications'
+ ],
+
+ onSaveClick: function (button) {
+ var eventType, callingPanel;
+ callingPanel = this.getView().callingPanel;
+
+ callingPanel.deviceId = this.lookupReference('deviceField').getValue();
+ callingPanel.groupId = this.lookupReference('groupField').getValue();
+ eventType = this.lookupReference('eventTypeField').getValue();
+ if (eventType.indexOf(Traccar.store.ReportEventTypes.allEvents) > -1) {
+ eventType = [Traccar.store.ReportEventTypes.allEvents];
+ } else if (eventType.length === this.lookupReference('eventTypeField').getStore().getCount() - 1) {
+ eventType = [Traccar.store.ReportEventTypes.allEvents];
+ }
+ callingPanel.eventType = eventType;
+ callingPanel.chartType = this.lookupReference('chartTypeField').getValue();
+ callingPanel.showMarkers = this.lookupReference('showMarkersField').getValue();
+ callingPanel.fromDate = this.lookupReference('fromDateField').getValue();
+ callingPanel.fromTime = this.lookupReference('fromTimeField').getValue();
+ callingPanel.toDate = this.lookupReference('toDateField').getValue();
+ callingPanel.toTime = this.lookupReference('toTimeField').getValue();
+ callingPanel.period = this.lookupReference('periodField').getValue();
+ callingPanel.updateButtons();
+ button.up('window').close();
+ },
+
+ onPeriodChange: function (combobox, newValue) {
+ var day, first, from, to, custom = newValue === 'custom';
+ this.lookupReference('fromContainer').setHidden(!custom);
+ this.lookupReference('toContainer').setHidden(!custom);
+ if (!custom) {
+ from = new Date();
+ to = new Date();
+ switch (newValue) {
+ case 'today':
+ to.setDate(to.getDate() + 1);
+ break;
+ case 'yesterday':
+ from.setDate(to.getDate() - 1);
+ break;
+ case 'thisWeek':
+ day = from.getDay();
+ first = from.getDate() - day + (day === 0 ? -6 : 1);
+ from.setDate(first);
+ to.setDate(first + 7);
+ break;
+ case 'previousWeek':
+ day = from.getDay();
+ first = from.getDate() - day + (day === 0 ? -6 : 1);
+ from.setDate(first - 7);
+ to.setDate(first);
+ break;
+ case 'thisMonth':
+ from.setDate(1);
+ to.setDate(1);
+ to.setMonth(from.getMonth() + 1);
+ break;
+ case 'previousMonth':
+ from.setDate(1);
+ from.setMonth(from.getMonth() - 1);
+ to.setDate(1);
+ break;
+ default:
+ break;
+ }
+ from.setHours(0, 0, 0, 0);
+ to.setHours(0, 0, 0, 0);
+ this.lookupReference('fromDateField').setValue(from);
+ this.lookupReference('fromTimeField').setValue(from);
+ this.lookupReference('toDateField').setValue(to);
+ this.lookupReference('toTimeField').setValue(to);
+ }
+ }
+});
diff --git a/legacy/web/app/view/dialog/SavedCommand.js b/legacy/web/app/view/dialog/SavedCommand.js
new file mode 100644
index 00000000..b1aeae73
--- /dev/null
+++ b/legacy/web/app/view/dialog/SavedCommand.js
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.SavedCommand', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.dialog.SavedCommandController',
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ controller: 'savedCommand',
+ title: Strings.sharedSavedCommand,
+
+ items: [{
+ xtype: 'form',
+ listeners: {
+ validitychange: 'onValidityChange'
+ },
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'description',
+ fieldLabel: Strings.sharedDescription
+ }, {
+ xtype: 'checkboxfield',
+ name: 'textChannel',
+ inputValue: true,
+ uncheckedValue: false,
+ fieldLabel: Strings.commandSendSms
+ }, {
+ xtype: 'combobox',
+ name: 'type',
+ reference: 'commandType',
+ fieldLabel: Strings.sharedType,
+ store: 'AllCommandTypes',
+ queryMode: 'local',
+ displayField: 'name',
+ valueField: 'type',
+ editable: false,
+ allowBlank: false,
+ listeners: {
+ change: 'onTypeChange'
+ }
+ }, {
+ xtype: 'fieldcontainer',
+ reference: 'parameters'
+ }]
+ }]
+ }],
+
+ buttons: [{
+ glyph: 'xf00c@FontAwesome',
+ reference: 'saveButton',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ disabled: true,
+ handler: 'onSaveClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/SavedCommandController.js b/legacy/web/app/view/dialog/SavedCommandController.js
new file mode 100644
index 00000000..37c56603
--- /dev/null
+++ b/legacy/web/app/view/dialog/SavedCommandController.js
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.SavedCommandController', {
+ extend: 'Traccar.view.dialog.BaseEditController',
+ alias: 'controller.savedCommand',
+
+ defaultFieldConfig: {
+ allowBlank: false
+ },
+
+ onTypeChange: function (combo, newValue) {
+ var i, config, command, parameters, parameter, record;
+ record = combo.up('window').down('form').getRecord();
+ this.lookupReference('parameters').removeAll();
+ command = Ext.getStore('KnownCommands').getById(newValue);
+ if (command && command.get('parameters')) {
+ parameters = command.get('parameters');
+ for (i = 0; i < parameters.length; i++) {
+ parameter = new Traccar.model.KnownAttribute(parameters[i]);
+ config = Ext.clone(this.defaultFieldConfig);
+ config.key = parameter.get('key');
+ config.fieldLabel = parameter.get('name');
+ if (record.get('attributes')) {
+ config.value = record.get('attributes')[parameter.get('key')];
+ }
+ config.disabled = combo.isDisabled();
+ switch (parameter.get('valueType')) {
+ case 'number':
+ config.xtype = 'customNumberField';
+ if (parameter.get('allowDecimals') !== undefined) {
+ config.allowDecimals = parameter.get('allowDecimals');
+ } else {
+ config.allowDecimals = true;
+ }
+ config.dataType = parameter.get('dataType');
+ config.maxValue = parameter.get('maxValue');
+ config.minValue = parameter.get('minValue');
+ break;
+ case 'boolean':
+ config.xtype = 'checkboxfield';
+ config.inputValue = true;
+ config.uncheckedValue = false;
+ break;
+ default:
+ if (parameter.get('dataType') === 'timezone') {
+ config.xtype = 'combobox';
+ config.queryMode = 'local';
+ config.displayField = 'key';
+ config.editable = false;
+ config.store = 'AllTimezones';
+ } else {
+ config.xtype = 'textfield';
+ }
+ }
+ this.lookupReference('parameters').add(config);
+ }
+ }
+ },
+
+ fillAttributes: function (button) {
+ var i, form, record, parameters, attributes = {};
+
+ form = button.up('window').down('form');
+ form.updateRecord();
+ record = form.getRecord();
+ parameters = this.lookupReference('parameters').items.items;
+
+ for (i = 0; i < parameters.length; i++) {
+ attributes[parameters[i].key] = parameters[i].getValue();
+ }
+
+ record.set('attributes', attributes);
+ },
+
+ onSaveClick: function (button) {
+ this.fillAttributes(button);
+ this.callParent(arguments);
+ },
+
+ onValidityChange: function (form, valid) {
+ this.lookupReference('saveButton').setDisabled(!valid);
+ }
+
+});
diff --git a/legacy/web/app/view/dialog/SelectDevice.js b/legacy/web/app/view/dialog/SelectDevice.js
new file mode 100644
index 00000000..5b11c03f
--- /dev/null
+++ b/legacy/web/app/view/dialog/SelectDevice.js
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.dialog.SelectDevice', {
+ extend: 'Traccar.view.dialog.Base',
+
+ requires: [
+ 'Traccar.view.dialog.SelectDeviceController'
+ ],
+
+ controller: 'selectDevice',
+ title: Strings.sharedDevice,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'combobox',
+ reference: 'deviceField',
+ store: 'Devices',
+ queryMode: 'local',
+ displayField: 'name',
+ valueField: 'id',
+ editable: false,
+ listeners: {
+ change: 'onDeviceChange'
+ }
+ }]
+ },
+
+ buttons: [{
+ glyph: 'xf00c@FontAwesome',
+ reference: 'saveButton',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSaveClick',
+ disabled: true
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/SelectDeviceController.js b/legacy/web/app/view/dialog/SelectDeviceController.js
new file mode 100644
index 00000000..9437991c
--- /dev/null
+++ b/legacy/web/app/view/dialog/SelectDeviceController.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.SelectDeviceController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.selectDevice',
+
+ onSaveClick: function (button) {
+ var deviceId, record;
+ deviceId = this.lookupReference('deviceField').getValue();
+ record = this.getView().record.data;
+ Ext.Ajax.request({
+ url: 'api/attributes/computed/test?deviceId=' + deviceId,
+ method: 'POST',
+ jsonData: Ext.util.JSON.encode(record),
+ callback: function (options, success, response) {
+ if (success) {
+ Ext.Msg.alert(Strings.sharedInfoTitle, response.responseText || response.statusText);
+ } else {
+ Traccar.app.showError(response);
+ }
+ }
+ });
+ button.up('window').close();
+ },
+
+ onDeviceChange: function (combobox, newValue) {
+ this.lookupReference('saveButton').setDisabled(newValue === null);
+ }
+});
diff --git a/legacy/web/app/view/dialog/SendCommand.js b/legacy/web/app/view/dialog/SendCommand.js
new file mode 100644
index 00000000..79954739
--- /dev/null
+++ b/legacy/web/app/view/dialog/SendCommand.js
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.SendCommand', {
+ extend: 'Traccar.view.dialog.Base',
+
+ requires: [
+ 'Traccar.view.dialog.SendCommandController'
+ ],
+
+ controller: 'sendCommand',
+ title: Strings.commandTitle,
+
+ items: [{
+ xtype: 'combobox',
+ reference: 'commandsComboBox',
+ fieldLabel: Strings.deviceCommand,
+ displayField: 'description',
+ valueField: 'id',
+ store: 'DeviceCommands',
+ queryMode: 'local',
+ editable: false,
+ allowBlank: false,
+ listeners: {
+ select: 'onCommandSelect'
+ }
+ }, {
+ xtype: 'form',
+ listeners: {
+ validitychange: 'onValidityChange'
+ },
+ items: [{
+ xtype: 'fieldset',
+ reference: 'newCommandFields',
+ disabled: true,
+ items: [{
+ xtype: 'checkboxfield',
+ name: 'textChannel',
+ reference: 'textChannelCheckBox',
+ inputValue: true,
+ uncheckedValue: false,
+ fieldLabel: Strings.commandSendSms,
+ listeners: {
+ change: 'onTextChannelChange'
+ }
+ }, {
+ xtype: 'combobox',
+ name: 'type',
+ reference: 'commandType',
+ fieldLabel: Strings.sharedType,
+ store: 'CommandTypes',
+ displayField: 'name',
+ valueField: 'type',
+ editable: false,
+ allowBlank: false,
+ listeners: {
+ change: 'onTypeChange'
+ }
+ }, {
+ xtype: 'fieldcontainer',
+ reference: 'parameters'
+ }]
+ }]
+ }],
+
+ buttons: [{
+ xtype: 'tbfill'
+ }, {
+ glyph: 'xf093@FontAwesome',
+ tooltip: Strings.sharedSend,
+ tooltipType: 'title',
+ minWidth: 0,
+ disabled: true,
+ reference: 'sendButton',
+ handler: 'onSendClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/SendCommandController.js b/legacy/web/app/view/dialog/SendCommandController.js
new file mode 100644
index 00000000..c6351587
--- /dev/null
+++ b/legacy/web/app/view/dialog/SendCommandController.js
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.SendCommandController', {
+ extend: 'Traccar.view.dialog.SavedCommandController',
+ alias: 'controller.sendCommand',
+
+ requires: [
+ 'Traccar.view.permissions.SavedCommands'
+ ],
+
+ onSendClick: function (button) {
+ var record;
+ this.fillAttributes(button);
+ record = button.up('window').down('form').getRecord();
+
+ Ext.Ajax.request({
+ scope: this,
+ url: 'api/commands/send',
+ jsonData: record.getData(),
+ callback: this.onSendResult
+ });
+ },
+
+ onValidityChange: function (form, valid) {
+ this.lookupReference('sendButton').setDisabled(!valid ||
+ this.lookupReference('commandsComboBox').getValue() === null);
+ },
+
+ onTextChannelChange: function (checkbox, newValue) {
+ var typesStore = this.lookupReference('commandType').getStore();
+ typesStore.getProxy().setExtraParam('textChannel', newValue);
+ typesStore.reload();
+ },
+
+ onCommandSelect: function (selected) {
+ var record, form, command = selected.getStore().getById(selected.getValue());
+ command.set('deviceId', this.getView().deviceId);
+ form = selected.up('window').down('form');
+ record = form.getRecord();
+ form.loadRecord(command);
+ if (record && command.get('type') === record.get('type')) {
+ this.onTypeChange(this.lookupReference('commandType'), command.get('type'));
+ }
+
+ this.lookupReference('newCommandFields').setDisabled(command.getId() !== 0);
+ this.lookupReference('sendButton').setDisabled(command.getId() === 0);
+ },
+
+ onSendResult: function (options, success, response) {
+ if (success) {
+ this.closeView();
+ Traccar.app.showToast(response.status === 202 ? Strings.commandQueued : Strings.commandSent);
+ } else {
+ Traccar.app.showError(response);
+ }
+ },
+
+ closeView: function () {
+ this.lookupReference('commandsComboBox').getStore().removeAll();
+ this.callParent(arguments);
+ }
+});
diff --git a/legacy/web/app/view/dialog/Server.js b/legacy/web/app/view/dialog/Server.js
new file mode 100644
index 00000000..6ee250b6
--- /dev/null
+++ b/legacy/web/app/view/dialog/Server.js
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2015 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.Server', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.ClearableComboBox',
+ 'Traccar.view.dialog.MapPickerController',
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ controller: 'mapPicker',
+ title: Strings.serverTitle,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedPreferences,
+ items: [{
+ xtype: 'clearableComboBox',
+ name: 'map',
+ fieldLabel: Strings.mapLayer,
+ store: 'MapTypes',
+ displayField: 'name',
+ valueField: 'key'
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'bingKey',
+ fieldLabel: Strings.mapBingKey
+ }, {
+ xtype: 'unescapedTextField',
+ reference: 'mapUrlField',
+ name: 'mapUrl',
+ fieldLabel: Strings.mapCustomLabel
+ }, {
+ xtype: 'numberfield',
+ reference: 'latitude',
+ name: 'latitude',
+ fieldLabel: Strings.positionLatitude,
+ decimalPrecision: Traccar.Style.coordinatePrecision
+ }, {
+ xtype: 'numberfield',
+ reference: 'longitude',
+ name: 'longitude',
+ fieldLabel: Strings.positionLongitude,
+ decimalPrecision: Traccar.Style.coordinatePrecision
+ }, {
+ xtype: 'numberfield',
+ reference: 'zoom',
+ name: 'zoom',
+ fieldLabel: Strings.serverZoom
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'twelveHourFormat',
+ fieldLabel: Strings.settingsTwelveHourFormat
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'forceSettings',
+ fieldLabel: Strings.serverForceSettings
+ }, {
+ xtype: 'clearableComboBox',
+ name: 'coordinateFormat',
+ fieldLabel: Strings.settingsCoordinateFormat,
+ store: 'CoordinateFormats',
+ displayField: 'name',
+ valueField: 'key'
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'poiLayer',
+ fieldLabel: Strings.mapPoiLayer
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'announcement',
+ fieldLabel: Strings.serverAnnouncement
+ }]
+ }, {
+ xtype: 'fieldset',
+ title: Strings.sharedPermissions,
+ collapsible: true,
+ collapsed: true,
+ items: [{
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'registration',
+ fieldLabel: Strings.serverRegistration
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'readonly',
+ fieldLabel: Strings.serverReadonly
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'deviceReadonly',
+ fieldLabel: Strings.userDeviceReadonly
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'limitCommands',
+ fieldLabel: Strings.userLimitCommands
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'disableReports',
+ fieldLabel: Strings.userDisableReports
+ }]
+ }]
+ },
+
+ buttons: [{
+ text: Strings.sharedAttributes,
+ handler: 'showAttributesView'
+ }, {
+ glyph: 'xf041@FontAwesome',
+ minWidth: 0,
+ handler: 'getMapState',
+ tooltip: Strings.sharedGetMapState,
+ tooltipType: 'title'
+ }, {
+ xtype: 'tbfill'
+ }, {
+ glyph: 'xf00c@FontAwesome',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSaveClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/User.js b/legacy/web/app/view/dialog/User.js
new file mode 100644
index 00000000..5da56424
--- /dev/null
+++ b/legacy/web/app/view/dialog/User.js
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2015 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.User', {
+ extend: 'Traccar.view.dialog.BaseEdit',
+
+ requires: [
+ 'Traccar.view.ClearableComboBox',
+ 'Traccar.view.dialog.UserController',
+ 'Traccar.view.UnescapedTextField'
+ ],
+
+ controller: 'user',
+ title: Strings.settingsUser,
+
+ items: {
+ xtype: 'form',
+ items: [{
+ xtype: 'fieldset',
+ title: Strings.sharedRequired,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'name',
+ fieldLabel: Strings.sharedName
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'email',
+ fieldLabel: Strings.userEmail,
+ allowBlank: false
+ }, {
+ xtype: 'textfield',
+ name: 'password',
+ fieldLabel: Strings.userPassword,
+ inputType: 'password',
+ allowBlank: false
+ }]
+ }, {
+ xtype: 'fieldset',
+ title: Strings.sharedPreferences,
+ collapsible: true,
+ collapsed: true,
+ items: [{
+ xtype: 'unescapedTextField',
+ name: 'phone',
+ fieldLabel: Strings.sharedPhone
+ }, {
+ xtype: 'clearableComboBox',
+ name: 'map',
+ fieldLabel: Strings.mapLayer,
+ store: 'MapTypes',
+ displayField: 'name',
+ valueField: 'key'
+ }, {
+ xtype: 'numberfield',
+ reference: 'latitude',
+ name: 'latitude',
+ fieldLabel: Strings.positionLatitude,
+ decimalPrecision: Traccar.Style.coordinatePrecision
+ }, {
+ xtype: 'numberfield',
+ reference: 'longitude',
+ name: 'longitude',
+ fieldLabel: Strings.positionLongitude,
+ decimalPrecision: Traccar.Style.coordinatePrecision
+ }, {
+ xtype: 'numberfield',
+ reference: 'zoom',
+ name: 'zoom',
+ fieldLabel: Strings.serverZoom
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'twelveHourFormat',
+ fieldLabel: Strings.settingsTwelveHourFormat
+ }, {
+ xtype: 'clearableComboBox',
+ name: 'coordinateFormat',
+ fieldLabel: Strings.settingsCoordinateFormat,
+ store: 'CoordinateFormats',
+ displayField: 'name',
+ valueField: 'key'
+ }, {
+ xtype: 'unescapedTextField',
+ name: 'poiLayer',
+ fieldLabel: Strings.mapPoiLayer
+ }]
+ }, {
+ xtype: 'fieldset',
+ title: Strings.sharedPermissions,
+ collapsible: true,
+ collapsed: true,
+ items: [{
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'disabled',
+ fieldLabel: Strings.sharedDisabled,
+ disabled: true,
+ reference: 'disabledField'
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'administrator',
+ fieldLabel: Strings.userAdmin,
+ disabled: true,
+ reference: 'adminField'
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'readonly',
+ fieldLabel: Strings.serverReadonly,
+ disabled: true,
+ reference: 'readonlyField'
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'deviceReadonly',
+ fieldLabel: Strings.userDeviceReadonly,
+ disabled: true,
+ reference: 'deviceReadonlyField'
+ }, {
+ xtype: 'checkboxfield',
+ inputValue: true,
+ uncheckedValue: false,
+ name: 'limitCommands',
+ 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',
+ fieldLabel: Strings.userExpirationTime,
+ disabled: true,
+ reference: 'expirationTimeField',
+ startDay: Traccar.Style.weekStartDay,
+ format: Traccar.Style.dateFormat
+ }, {
+ xtype: 'numberfield',
+ name: 'deviceLimit',
+ fieldLabel: Strings.userDeviceLimit,
+ disabled: true,
+ reference: 'deviceLimitField'
+ }, {
+ xtype: 'numberfield',
+ name: 'userLimit',
+ fieldLabel: Strings.userUserLimit,
+ disabled: true,
+ reference: 'userLimitField'
+ }]
+ }]
+ },
+
+ buttons: [{
+ text: Strings.sharedAttributes,
+ handler: 'showAttributesView'
+ }, {
+ glyph: 'xf041@FontAwesome',
+ minWidth: 0,
+ handler: 'getMapState',
+ tooltip: Strings.sharedGetMapState,
+ tooltipType: 'title'
+ }, {
+ glyph: 'xf003@FontAwesome',
+ minWidth: 0,
+ handler: 'testNotification',
+ hidden: true,
+ reference: 'testNotificationButton',
+ tooltip: Strings.sharedTestNotification,
+ tooltipType: 'title'
+ }, {
+ xtype: 'tbfill'
+ }, {
+ glyph: 'xf00c@FontAwesome',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSaveClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'closeView'
+ }]
+});
diff --git a/legacy/web/app/view/dialog/UserController.js b/legacy/web/app/view/dialog/UserController.js
new file mode 100644
index 00000000..0d620614
--- /dev/null
+++ b/legacy/web/app/view/dialog/UserController.js
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.dialog.UserController', {
+ extend: 'Traccar.view.dialog.MapPickerController',
+ alias: 'controller.user',
+
+ init: function () {
+ if (Traccar.app.getUser().get('administrator')) {
+ this.lookupReference('adminField').setDisabled(false);
+ this.lookupReference('deviceLimitField').setDisabled(false);
+ this.lookupReference('userLimitField').setDisabled(false);
+ }
+ if (Traccar.app.getUser().get('administrator') || !this.getView().selfEdit) {
+ this.lookupReference('readonlyField').setDisabled(false);
+ this.lookupReference('disabledField').setDisabled(false);
+ this.lookupReference('expirationTimeField').setDisabled(false);
+ this.lookupReference('deviceReadonlyField').setDisabled(false);
+ this.lookupReference('limitCommandsField').setDisabled(false);
+ this.lookupReference('disableReportsField').setDisabled(false);
+ }
+ },
+
+ testNotification: function () {
+ Ext.Ajax.request({
+ url: 'api/notifications/test',
+ method: 'POST',
+ failure: function (response) {
+ Traccar.app.showError(response);
+ }
+ });
+ },
+
+ onSaveClick: function (button) {
+ var dialog, record, store;
+ dialog = button.up('window').down('form');
+ dialog.updateRecord();
+ record = dialog.getRecord();
+ if (record === Traccar.app.getUser()) {
+ record.save();
+ } else {
+ store = Ext.getStore('Users');
+ if (record.phantom) {
+ store.add(record);
+ }
+ store.sync({
+ failure: function (batch) {
+ store.rejectChanges();
+ Traccar.app.showError(batch.exceptions[0].getError().response);
+ }
+ });
+ }
+ button.up('window').close();
+ }
+});
diff --git a/legacy/web/app/view/edit/Attributes.js b/legacy/web/app/view/edit/Attributes.js
new file mode 100644
index 00000000..af4f5a90
--- /dev/null
+++ b/legacy/web/app/view/edit/Attributes.js
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Attributes', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'attributesView',
+
+ requires: [
+ 'Traccar.view.edit.AttributesController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'attributes',
+
+ tbar: {
+ xtype: 'editToolbar'
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ filter: 'string',
+ renderer: function (value) {
+ var attribute;
+ if (this.attributesStore) {
+ attribute = Ext.getStore(this.attributesStore).getById(value);
+ }
+ return attribute && attribute.get('name') || value;
+ }
+ }, {
+ text: Strings.stateValue,
+ dataIndex: 'value',
+ renderer: function (value, metaData, record) {
+ var attribute;
+ if (this.attributesStore) {
+ attribute = Ext.getStore(this.attributesStore).getById(record.get('name'));
+ }
+ return Traccar.AttributeFormatter.renderAttribute(value, attribute);
+ }
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/AttributesController.js b/legacy/web/app/view/edit/AttributesController.js
new file mode 100644
index 00000000..84ff6adf
--- /dev/null
+++ b/legacy/web/app/view/edit/AttributesController.js
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.AttributesController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.attributes',
+
+ requires: [
+ 'Traccar.view.dialog.Attribute',
+ 'Traccar.store.Attributes',
+ 'Traccar.model.Attribute'
+ ],
+
+ removeTitle: Strings.stateName,
+
+ init: function () {
+ var store, propertyName, i = 0, attributes;
+ store = Ext.create('Traccar.store.Attributes');
+ store.setProxy(Ext.create('Ext.data.proxy.Memory'));
+ if (typeof this.getView().record.get('attributes') === 'undefined') {
+ this.getView().record.set('attributes', {});
+ }
+ attributes = this.getView().record.get('attributes');
+ for (propertyName in attributes) {
+ if (attributes.hasOwnProperty(propertyName)) {
+ store.add(Ext.create('Traccar.model.Attribute', {
+ priority: i++,
+ name: propertyName,
+ value: attributes[propertyName]
+ }));
+ }
+ }
+ store.addListener('add', function (store, records) {
+ var i, view;
+ view = this.getView();
+ for (i = 0; i < records.length; i++) {
+ view.record.get('attributes')[records[i].get('name')] = records[i].get('value');
+ }
+ view.record.dirty = true;
+ }, this);
+ store.addListener('update', function (store, record, operation) {
+ var view;
+ view = this.getView();
+ if (operation === Ext.data.Model.EDIT) {
+ if (record.modified.name !== record.get('name')) {
+ delete view.record.get('attributes')[record.modified.name];
+ }
+ view.record.get('attributes')[record.get('name')] = record.get('value');
+ view.record.dirty = true;
+ }
+ }, this);
+ store.addListener('remove', function (store, records) {
+ var i, view;
+ view = this.getView();
+ for (i = 0; i < records.length; i++) {
+ delete view.record.get('attributes')[records[i].get('name')];
+ }
+ view.record.dirty = true;
+ }, this);
+
+ this.getView().setStore(store);
+ if (this.getView().record instanceof Traccar.model.Device) {
+ this.getView().attributesStore = 'DeviceAttributes';
+ } else if (this.getView().record instanceof Traccar.model.Geofence) {
+ this.getView().attributesStore = 'GeofenceAttributes';
+ } else if (this.getView().record instanceof Traccar.model.Group) {
+ this.getView().attributesStore = 'GroupAttributes';
+ } else if (this.getView().record instanceof Traccar.model.Server) {
+ this.getView().attributesStore = 'ServerAttributes';
+ } else if (this.getView().record instanceof Traccar.model.User) {
+ this.getView().attributesStore = 'UserAttributes';
+ }
+ },
+
+ comboConfig: {
+ xtype: 'combobox',
+ reference: 'nameComboField',
+ name: 'name',
+ fieldLabel: Strings.sharedName,
+ displayField: 'name',
+ valueField: 'key',
+ allowBlank: false,
+ queryMode: 'local',
+ listeners: {
+ change: 'onNameChange'
+ }
+ },
+
+ initDialog: function (record) {
+ var nameTextField, dialog = Ext.create('Traccar.view.dialog.Attribute');
+ if (this.getView().attributesStore) {
+ this.comboConfig.store = this.getView().attributesStore;
+ nameTextField = dialog.lookupReference('nameTextField');
+ dialog.down('form').insert(0, this.comboConfig);
+ dialog.down('form').remove(nameTextField);
+ }
+ dialog.down('form').loadRecord(record);
+ dialog.show();
+ },
+
+ onAddClick: function () {
+ var objectInstance = Ext.create('Traccar.model.Attribute');
+ objectInstance.store = this.getView().getStore();
+ this.initDialog(objectInstance);
+ },
+
+ onEditClick: function () {
+ this.initDialog(this.getView().getSelectionModel().getSelection()[0]);
+ }
+});
diff --git a/legacy/web/app/view/edit/Calendars.js b/legacy/web/app/view/edit/Calendars.js
new file mode 100644
index 00000000..23f20e25
--- /dev/null
+++ b/legacy/web/app/view/edit/Calendars.js
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Calendars', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'calendarsView',
+
+ requires: [
+ 'Traccar.view.edit.CalendarsController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'calendars',
+ store: 'Calendars',
+
+ tbar: {
+ xtype: 'editToolbar'
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ filter: 'string'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/CalendarsController.js b/legacy/web/app/view/edit/CalendarsController.js
new file mode 100644
index 00000000..d11ec379
--- /dev/null
+++ b/legacy/web/app/view/edit/CalendarsController.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.CalendarsController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.calendars',
+
+ requires: [
+ 'Traccar.view.dialog.Calendar',
+ 'Traccar.model.Calendar'
+ ],
+
+ objectModel: 'Traccar.model.Calendar',
+ objectDialog: 'Traccar.view.dialog.Calendar',
+ removeTitle: Strings.sharedCalendar
+});
diff --git a/legacy/web/app/view/edit/ComputedAttributes.js b/legacy/web/app/view/edit/ComputedAttributes.js
new file mode 100644
index 00000000..9f0b9396
--- /dev/null
+++ b/legacy/web/app/view/edit/ComputedAttributes.js
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.ComputedAttributes', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'computedAttributesView',
+
+ requires: [
+ 'Traccar.view.edit.ComputedAttributesController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'computedAttributes',
+ store: 'ComputedAttributes',
+
+ tbar: {
+ xtype: 'editToolbar'
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedDescription,
+ dataIndex: 'description',
+ filter: 'string'
+ }, {
+ text: Strings.sharedAttribute,
+ dataIndex: 'attribute',
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'PositionAttributes'
+ },
+ renderer: function (value) {
+ return Ext.getStore('PositionAttributes').getAttributeName(value);
+ }
+ }, {
+ text: Strings.sharedExpression,
+ dataIndex: 'expression'
+ }, {
+ text: Strings.sharedType,
+ dataIndex: 'type',
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'AttributeValueTypes'
+ },
+ renderer: function (value) {
+ var type = Ext.getStore('AttributeValueTypes').getById(value);
+ if (type) {
+ return type.get('name');
+ } else {
+ return value;
+ }
+ }
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/ComputedAttributesController.js b/legacy/web/app/view/edit/ComputedAttributesController.js
new file mode 100644
index 00000000..6ae14102
--- /dev/null
+++ b/legacy/web/app/view/edit/ComputedAttributesController.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.ComputedAttributesController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.computedAttributes',
+
+ requires: [
+ 'Traccar.view.dialog.ComputedAttribute',
+ 'Traccar.model.ComputedAttribute'
+ ],
+
+ objectModel: 'Traccar.model.ComputedAttribute',
+ objectDialog: 'Traccar.view.dialog.ComputedAttribute',
+ removeTitle: Strings.sharedComputedAttribute
+});
diff --git a/legacy/web/app/view/edit/Devices.js b/legacy/web/app/view/edit/Devices.js
new file mode 100644
index 00000000..5f54202a
--- /dev/null
+++ b/legacy/web/app/view/edit/Devices.js
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Devices', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'devicesView',
+
+ requires: [
+ 'Traccar.AttributeFormatter',
+ 'Traccar.view.edit.DevicesController',
+ 'Traccar.view.ArrayListFilter',
+ 'Traccar.view.DeviceMenu'
+ ],
+
+ controller: 'devices',
+
+ store: 'VisibleDevices',
+
+ stateful: true,
+ stateId: 'devices-grid',
+
+ tbar: {
+ componentCls: 'toolbar-header-style',
+ defaults: {
+ xtype: 'button',
+ disabled: true,
+ tooltipType: 'title'
+ },
+ items: [{
+ xtype: 'tbtext',
+ html: Strings.deviceTitle,
+ baseCls: 'x-panel-header-title-default'
+ }, {
+ xtype: 'tbfill',
+ disabled: false
+ }, {
+ handler: 'onAddClick',
+ reference: 'toolbarAddButton',
+ glyph: 'xf067@FontAwesome',
+ tooltip: Strings.sharedAdd
+ }, {
+ handler: 'onEditClick',
+ reference: 'toolbarEditButton',
+ glyph: 'xf040@FontAwesome',
+ tooltip: Strings.sharedEdit
+ }, {
+ handler: 'onRemoveClick',
+ reference: 'toolbarRemoveButton',
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedRemove
+ }, {
+ handler: 'onCommandClick',
+ reference: 'deviceCommandButton',
+ glyph: 'xf093@FontAwesome',
+ tooltip: Strings.deviceCommand
+ }, {
+ xtype: 'deviceMenu',
+ reference: 'toolbarDeviceMenu',
+ enableToggle: false
+ }]
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ viewConfig: {
+ enableTextSelection: true,
+ getRowClass: function (record) {
+ var result = '', status = record.get('status');
+ if (record.get('disabled')) {
+ result = 'view-item-disabled ';
+ }
+ if (status) {
+ result += Ext.getStore('DeviceStatuses').getById(status).get('color');
+ }
+ return result;
+ }
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ filter: 'string'
+ }, {
+ text: Strings.deviceIdentifier,
+ dataIndex: 'uniqueId',
+ hidden: true,
+ filter: 'string'
+ }, {
+ text: Strings.sharedPhone,
+ dataIndex: 'phone',
+ hidden: true
+ }, {
+ text: Strings.deviceModel,
+ dataIndex: 'model',
+ hidden: true
+ }, {
+ text: Strings.deviceContact,
+ dataIndex: 'contact',
+ hidden: true
+ }, {
+ text: Strings.groupDialog,
+ dataIndex: 'groupId',
+ hidden: true,
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'Groups'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('groupId')
+ }, {
+ text: Strings.sharedDisabled,
+ dataIndex: 'disabled',
+ renderer: Traccar.AttributeFormatter.getFormatter('disabled'),
+ hidden: true,
+ filter: 'boolean'
+ }, {
+ text: Strings.deviceStatus,
+ dataIndex: 'status',
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'DeviceStatuses'
+ },
+ renderer: function (value) {
+ var status;
+ if (value) {
+ status = Ext.getStore('DeviceStatuses').getById(value);
+ if (status) {
+ return status.get('name');
+ }
+ }
+ return null;
+ }
+ }, {
+ text: Strings.deviceLastUpdate,
+ dataIndex: 'lastUpdate',
+ renderer: Traccar.AttributeFormatter.getFormatter('lastUpdate')
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/DevicesController.js b/legacy/web/app/view/edit/DevicesController.js
new file mode 100644
index 00000000..16e54b21
--- /dev/null
+++ b/legacy/web/app/view/edit/DevicesController.js
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.DevicesController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.devices',
+
+ requires: [
+ 'Traccar.view.dialog.SendCommand',
+ 'Traccar.view.dialog.Device',
+ 'Traccar.view.permissions.Geofences',
+ 'Traccar.view.permissions.ComputedAttributes',
+ 'Traccar.view.permissions.Drivers',
+ 'Traccar.view.permissions.SavedCommands',
+ 'Traccar.view.BaseWindow',
+ 'Traccar.model.Device',
+ 'Traccar.model.Command'
+ ],
+
+ config: {
+ listen: {
+ controller: {
+ '*': {
+ selectreport: 'deselectDevice',
+ selectevent: 'deselectDevice'
+ },
+ 'root': {
+ selectdevice: 'selectDevice'
+ },
+ 'map': {
+ selectdevice: 'selectDevice',
+ deselectfeature: 'deselectFeature'
+ }
+ },
+ store: {
+ '#Devices': {
+ update: 'onUpdateDevice'
+ }
+ }
+ }
+ },
+
+ objectModel: 'Traccar.model.Device',
+ objectDialog: 'Traccar.view.dialog.Device',
+ removeTitle: Strings.sharedDevice,
+
+ init: function () {
+ var self = this, readonly, deviceReadonly;
+ deviceReadonly = Traccar.app.getPreference('deviceReadonly', false) && !Traccar.app.getUser().get('administrator');
+ readonly = Traccar.app.getPreference('readonly', false) && !Traccar.app.getUser().get('administrator');
+ this.lookupReference('toolbarAddButton').setDisabled(readonly || deviceReadonly);
+ this.lookupReference('toolbarDeviceMenu').setHidden(readonly || deviceReadonly);
+
+ setInterval(function () {
+ self.getView().getView().refresh();
+ }, Traccar.Style.refreshPeriod);
+ },
+
+ onCommandClick: function () {
+ var device, deviceId, dialog, typesStore, commandsStore;
+ device = this.getView().getSelectionModel().getSelection()[0];
+ deviceId = device.get('id');
+
+ dialog = Ext.create('Traccar.view.dialog.SendCommand');
+ dialog.deviceId = deviceId;
+
+ commandsStore = dialog.lookupReference('commandsComboBox').getStore();
+ commandsStore.getProxy().setExtraParam('deviceId', deviceId);
+ if (!Traccar.app.getPreference('limitCommands', false)) {
+ commandsStore.add({
+ id: 0,
+ description: Strings.sharedNew
+ });
+ }
+ commandsStore.load({
+ addRecords: true
+ });
+
+ typesStore = dialog.lookupReference('commandType').getStore();
+ typesStore.getProxy().setExtraParam('deviceId', deviceId);
+ typesStore.load();
+
+ dialog.show();
+ },
+
+ updateButtons: function (selected) {
+ var readonly, deviceReadonly, empty, deviceMenu;
+ deviceReadonly = Traccar.app.getPreference('deviceReadonly', false) && !Traccar.app.getUser().get('administrator');
+ readonly = Traccar.app.getPreference('readonly', false) && !Traccar.app.getUser().get('administrator');
+ empty = selected.length === 0;
+ this.lookupReference('toolbarEditButton').setDisabled(empty || readonly || deviceReadonly);
+ this.lookupReference('toolbarRemoveButton').setDisabled(empty || readonly || deviceReadonly);
+ deviceMenu = this.lookupReference('toolbarDeviceMenu');
+ deviceMenu.device = empty ? null : selected[0];
+ deviceMenu.setDisabled(empty);
+ this.lookupReference('deviceCommandButton').setDisabled(empty || readonly);
+ },
+
+ onSelectionChange: function (el, records) {
+ if (records && records.length) {
+ this.updateButtons(records);
+ this.fireEvent('selectdevice', records[0], true);
+ }
+ },
+
+ selectDevice: function (device) {
+ this.getView().getSelectionModel().select([device], false, true);
+ this.updateButtons(this.getView().getSelectionModel().getSelected().items);
+ this.getView().getView().focusRow(device);
+ },
+
+ deselectDevice: function (object) {
+ if (object) {
+ this.deselectFeature();
+ }
+ },
+
+ onUpdateDevice: function () {
+ this.updateButtons(this.getView().getSelectionModel().getSelected().items);
+ },
+
+ deselectFeature: function () {
+ this.getView().getSelectionModel().deselectAll();
+ }
+});
diff --git a/legacy/web/app/view/edit/Drivers.js b/legacy/web/app/view/edit/Drivers.js
new file mode 100644
index 00000000..7bd10a68
--- /dev/null
+++ b/legacy/web/app/view/edit/Drivers.js
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Drivers', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'driversView',
+
+ requires: [
+ 'Traccar.view.edit.DriversController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'drivers',
+ store: 'Drivers',
+
+ tbar: {
+ xtype: 'editToolbar'
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ filter: 'string'
+ }, {
+ text: Strings.deviceIdentifier,
+ dataIndex: 'uniqueId',
+ filter: 'string'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/DriversController.js b/legacy/web/app/view/edit/DriversController.js
new file mode 100644
index 00000000..6c8a63cc
--- /dev/null
+++ b/legacy/web/app/view/edit/DriversController.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.DriversController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.drivers',
+
+ requires: [
+ 'Traccar.view.dialog.Driver',
+ 'Traccar.model.Driver'
+ ],
+
+ objectModel: 'Traccar.model.Driver',
+ objectDialog: 'Traccar.view.dialog.Driver',
+ removeTitle: Strings.sharedDriver
+});
diff --git a/legacy/web/app/view/edit/Geofences.js b/legacy/web/app/view/edit/Geofences.js
new file mode 100644
index 00000000..0e1e6773
--- /dev/null
+++ b/legacy/web/app/view/edit/Geofences.js
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Geofences', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'geofencesView',
+
+ requires: [
+ 'Traccar.view.edit.GeofencesController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'geofences',
+ store: 'Geofences',
+
+ tbar: {
+ xtype: 'editToolbar'
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ filter: 'string'
+ }, {
+ text: Strings.sharedDescription,
+ dataIndex: 'description',
+ filter: 'string'
+ }, {
+ text: Strings.sharedCalendar,
+ dataIndex: 'calendarId',
+ hidden: true,
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'AllCalendars'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('calendarId')
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/GeofencesController.js b/legacy/web/app/view/edit/GeofencesController.js
new file mode 100644
index 00000000..73d367ac
--- /dev/null
+++ b/legacy/web/app/view/edit/GeofencesController.js
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.GeofencesController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.geofences',
+
+ requires: [
+ 'Traccar.view.dialog.Geofence',
+ 'Traccar.model.Geofence'
+ ],
+
+ objectModel: 'Traccar.model.Geofence',
+ objectDialog: 'Traccar.view.dialog.Geofence',
+ removeTitle: Strings.sharedGeofence
+});
diff --git a/legacy/web/app/view/edit/Groups.js b/legacy/web/app/view/edit/Groups.js
new file mode 100644
index 00000000..8b09316c
--- /dev/null
+++ b/legacy/web/app/view/edit/Groups.js
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2016 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Groups', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'groupsView',
+
+ requires: [
+ 'Traccar.AttributeFormatter',
+ 'Traccar.view.edit.GroupsController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'groups',
+ store: 'Groups',
+
+ tbar: {
+ xtype: 'editToolbar',
+ items: [{
+ xtype: 'button',
+ disabled: true,
+ handler: 'onGeofencesClick',
+ reference: 'toolbarGeofencesButton',
+ glyph: 'xf21d@FontAwesome',
+ tooltip: Strings.sharedGeofences,
+ tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onAttributesClick',
+ reference: 'toolbarAttributesButton',
+ glyph: 'xf0ae@FontAwesome',
+ tooltip: Strings.sharedComputedAttributes,
+ tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onDriversClick',
+ reference: 'toolbarDriversButton',
+ glyph: 'xf084@FontAwesome',
+ tooltip: Strings.sharedDrivers,
+ tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onCommandsClick',
+ reference: 'toolbarCommandsButton',
+ glyph: 'xf093@FontAwesome',
+ tooltip: Strings.sharedSavedCommands,
+ tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onNotificationsClick',
+ reference: 'toolbarNotificationsButton',
+ glyph: 'xf003@FontAwesome',
+ tooltip: Strings.sharedNotifications,
+ tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onMaintenancesClick',
+ reference: 'toolbarMaintenancesButton',
+ glyph: 'xf0ad@FontAwesome',
+ tooltip: Strings.sharedMaintenance,
+ tooltipType: 'title'
+ }]
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ filter: 'string'
+ }, {
+ text: Strings.groupDialog,
+ dataIndex: 'groupId',
+ hidden: true,
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'AllGroups'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('groupId')
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/GroupsController.js b/legacy/web/app/view/edit/GroupsController.js
new file mode 100644
index 00000000..ae96a248
--- /dev/null
+++ b/legacy/web/app/view/edit/GroupsController.js
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2016 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.GroupsController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.groups',
+
+ requires: [
+ 'Traccar.view.dialog.Group',
+ 'Traccar.view.permissions.Geofences',
+ 'Traccar.view.permissions.ComputedAttributes',
+ 'Traccar.view.permissions.Drivers',
+ 'Traccar.view.permissions.SavedCommands',
+ 'Traccar.view.permissions.Maintenances',
+ 'Traccar.view.BaseWindow',
+ 'Traccar.model.Group'
+ ],
+
+ objectModel: 'Traccar.model.Group',
+ objectDialog: 'Traccar.view.dialog.Group',
+ removeTitle: Strings.groupDialog,
+
+ init: function () {
+ this.lookupReference('toolbarDriversButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers'));
+ this.lookupReference('toolbarAttributesButton').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes'));
+ this.lookupReference('toolbarCommandsButton').setHidden(Traccar.app.getPreference('limitCommands', false));
+ this.lookupReference('toolbarMaintenancesButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableMaintenance'));
+ },
+
+ onGeofencesClick: function () {
+ var group = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedGeofences,
+ items: {
+ xtype: 'linkGeofencesView',
+ baseObjectName: 'groupId',
+ linkObjectName: 'geofenceId',
+ storeName: 'Geofences',
+ baseObject: group.getId()
+ }
+ }).show();
+ },
+
+ onAttributesClick: function () {
+ var group = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedComputedAttributes,
+ items: {
+ xtype: 'linkComputedAttributesView',
+ baseObjectName: 'groupId',
+ linkObjectName: 'attributeId',
+ storeName: 'ComputedAttributes',
+ baseObject: group.getId()
+ }
+ }).show();
+ },
+
+ onDriversClick: function () {
+ var group = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedDrivers,
+ items: {
+ xtype: 'linkDriversView',
+ baseObjectName: 'groupId',
+ linkObjectName: 'driverId',
+ storeName: 'Drivers',
+ baseObject: group.getId()
+ }
+ }).show();
+ },
+
+ onCommandsClick: function () {
+ var group = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedSavedCommands,
+ items: {
+ xtype: 'linkSavedCommandsView',
+ baseObjectName: 'groupId',
+ linkObjectName: 'commandId',
+ storeName: 'Commands',
+ baseObject: group.getId()
+ }
+ }).show();
+ },
+
+ onNotificationsClick: function () {
+ var group = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedNotifications,
+ items: {
+ xtype: 'linkNotificationsView',
+ baseObjectName: 'groupId',
+ linkObjectName: 'notificationId',
+ storeName: 'Notifications',
+ baseObject: group.getId()
+ }
+ }).show();
+ },
+
+ onMaintenancesClick: function () {
+ var group = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedMaintenance,
+ items: {
+ xtype: 'linkMaintenancesView',
+ baseObjectName: 'groupId',
+ linkObjectName: 'maintenanceId',
+ storeName: 'Maintenances',
+ baseObject: group.getId()
+ }
+ }).show();
+ },
+
+ onSelectionChange: function (selection, selected) {
+ var disabled = selected.length === 0;
+ this.lookupReference('toolbarGeofencesButton').setDisabled(disabled);
+ this.lookupReference('toolbarAttributesButton').setDisabled(disabled);
+ this.lookupReference('toolbarDriversButton').setDisabled(disabled);
+ this.lookupReference('toolbarCommandsButton').setDisabled(disabled);
+ this.lookupReference('toolbarNotificationsButton').setDisabled(disabled);
+ this.lookupReference('toolbarMaintenancesButton').setDisabled(disabled);
+ this.callParent(arguments);
+ }
+});
diff --git a/legacy/web/app/view/edit/Maintenances.js b/legacy/web/app/view/edit/Maintenances.js
new file mode 100644
index 00000000..da129154
--- /dev/null
+++ b/legacy/web/app/view/edit/Maintenances.js
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Maintenances', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'maintenancesView',
+
+ requires: [
+ 'Traccar.view.edit.MaintenancesController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'maintenances',
+ store: 'Maintenances',
+
+ tbar: {
+ xtype: 'editToolbar'
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ filter: 'string'
+ }, {
+ text: Strings.sharedType,
+ dataIndex: 'type',
+ filter: {
+ type: 'list',
+ idField: 'key',
+ labelField: 'name',
+ store: 'MaintenanceTypes'
+ },
+ renderer: function (value) {
+ var attribute = Ext.getStore('MaintenanceTypes').getById(value);
+ return attribute && attribute.get('name') || value;
+ }
+ }, {
+ text: Strings.maintenanceStart,
+ dataIndex: 'start',
+ renderer: function (value, metaData, record) {
+ return Traccar.AttributeFormatter.renderAttribute(
+ value, Ext.getStore('MaintenanceTypes').getById(record.get('type')));
+ }
+ }, {
+ text: Strings.maintenancePeriod,
+ dataIndex: 'period',
+ renderer: function (value, metaData, record) {
+ return Traccar.AttributeFormatter.renderAttribute(
+ value, Ext.getStore('MaintenanceTypes').getById(record.get('type')));
+ }
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/MaintenancesController.js b/legacy/web/app/view/edit/MaintenancesController.js
new file mode 100644
index 00000000..19762e61
--- /dev/null
+++ b/legacy/web/app/view/edit/MaintenancesController.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.MaintenancesController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.maintenances',
+
+ requires: [
+ 'Traccar.view.dialog.Maintenance',
+ 'Traccar.model.Maintenance'
+ ],
+
+ objectModel: 'Traccar.model.Maintenance',
+ objectDialog: 'Traccar.view.dialog.Maintenance',
+ removeTitle: Strings.sharedMaintenance
+});
diff --git a/legacy/web/app/view/edit/Notifications.js b/legacy/web/app/view/edit/Notifications.js
new file mode 100644
index 00000000..9cf97b19
--- /dev/null
+++ b/legacy/web/app/view/edit/Notifications.js
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Notifications', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'notificationsView',
+
+ requires: [
+ 'Traccar.view.edit.NotificationsController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'notifications',
+ store: 'Notifications',
+
+ tbar: {
+ xtype: 'editToolbar'
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.notificationType,
+ dataIndex: 'type',
+ flex: 2,
+ renderer: function (value) {
+ return Traccar.app.getEventString(value);
+ },
+ filter: {
+ type: 'list',
+ idField: 'type',
+ labelField: 'name',
+ store: 'AllNotificationTypes'
+ }
+ }, {
+ text: Strings.notificationAlways,
+ dataIndex: 'always',
+ renderer: Traccar.AttributeFormatter.getFormatter('always'),
+ filter: 'boolean'
+ }, {
+ text: Strings.sharedAlarms,
+ dataIndex: 'attributes',
+ renderer: function (value) {
+ var i, key, result = '', alarms = value && value['alarms'];
+ if (alarms) {
+ alarms = alarms.split(',');
+ for (i = 0; i < alarms.length; i++) {
+ key = 'alarm' + alarms[i].charAt(0).toUpperCase() + alarms[i].slice(1);
+ if (result) {
+ result += ', ';
+ }
+ result += Strings[key] || key;
+ }
+ }
+ return result;
+ }
+ }, {
+ text: Strings.notificationNotificators,
+ dataIndex: 'notificators',
+ flex: 2,
+ filter: {
+ type: 'arraylist',
+ idField: 'type',
+ labelField: 'name',
+ store: 'AllNotificators'
+ },
+ renderer: function (value) {
+ var result = '', i, notificators;
+ if (value) {
+ notificators = value.split(/[ ,]+/).filter(Boolean);
+ for (i = 0; i < notificators.length; i++) {
+ result += Traccar.app.getNotificatorString(notificators[i]) + (i < notificators.length - 1 ? ', ' : '');
+ }
+ }
+ return result;
+ }
+ }, {
+ text: Strings.sharedCalendar,
+ dataIndex: 'calendarId',
+ hidden: true,
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'AllCalendars'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('calendarId')
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/NotificationsController.js b/legacy/web/app/view/edit/NotificationsController.js
new file mode 100644
index 00000000..ad22a686
--- /dev/null
+++ b/legacy/web/app/view/edit/NotificationsController.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.NotificationsController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.notifications',
+
+ requires: [
+ 'Traccar.view.dialog.Notification',
+ 'Traccar.model.Notification'
+ ],
+
+ objectModel: 'Traccar.model.Notification',
+ objectDialog: 'Traccar.view.dialog.Notification',
+ removeTitle: Strings.sharedNotification
+});
diff --git a/legacy/web/app/view/edit/SavedCommands.js b/legacy/web/app/view/edit/SavedCommands.js
new file mode 100644
index 00000000..9e5f4869
--- /dev/null
+++ b/legacy/web/app/view/edit/SavedCommands.js
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.SavedCommands', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'savedCommandsView',
+
+ requires: [
+ 'Traccar.view.edit.SavedCommandsController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'savedCommands',
+ store: 'Commands',
+
+ tbar: {
+ xtype: 'editToolbar'
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedDescription,
+ dataIndex: 'description',
+ filter: 'string'
+ }, {
+ text: Strings.sharedType,
+ dataIndex: 'type',
+ filter: {
+ type: 'list',
+ idField: 'type',
+ labelField: 'name',
+ store: 'AllCommandTypes'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('commandType')
+ }, {
+ text: Strings.commandSendSms,
+ dataIndex: 'textChannel',
+ renderer: Traccar.AttributeFormatter.getFormatter('textChannel'),
+ filter: 'boolean'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/SavedCommandsController.js b/legacy/web/app/view/edit/SavedCommandsController.js
new file mode 100644
index 00000000..1511661e
--- /dev/null
+++ b/legacy/web/app/view/edit/SavedCommandsController.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.SavedCommandsController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.savedCommands',
+
+ requires: [
+ 'Traccar.view.dialog.SavedCommand',
+ 'Traccar.model.Command'
+ ],
+
+ objectModel: 'Traccar.model.Command',
+ objectDialog: 'Traccar.view.dialog.SavedCommand',
+ removeTitle: Strings.sharedSavedCommand
+});
diff --git a/legacy/web/app/view/edit/Toolbar.js b/legacy/web/app/view/edit/Toolbar.js
new file mode 100644
index 00000000..6999030b
--- /dev/null
+++ b/legacy/web/app/view/edit/Toolbar.js
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Toolbar', {
+ extend: 'Ext.toolbar.Toolbar',
+ xtype: 'editToolbar',
+
+ initComponent: function () {
+ this.callParent(arguments);
+ this.add(0, [{
+ xtype: 'button',
+ handler: 'onAddClick',
+ reference: 'toolbarAddButton',
+ glyph: 'xf067@FontAwesome',
+ tooltip: Strings.sharedAdd,
+ tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onEditClick',
+ reference: 'toolbarEditButton',
+ glyph: 'xf040@FontAwesome',
+ tooltip: Strings.sharedEdit,
+ tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onRemoveClick',
+ reference: 'toolbarRemoveButton',
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedRemove,
+ tooltipType: 'title'
+ }]);
+ }
+});
diff --git a/legacy/web/app/view/edit/ToolbarController.js b/legacy/web/app/view/edit/ToolbarController.js
new file mode 100644
index 00000000..d3ca9de6
--- /dev/null
+++ b/legacy/web/app/view/edit/ToolbarController.js
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.edit.ToolbarController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.toolbarController',
+
+ onAddClick: function () {
+ var dialog, objectInstance = Ext.create(this.objectModel);
+ objectInstance.store = this.getView().getStore();
+ if (objectInstance.store instanceof Ext.data.ChainedStore) {
+ objectInstance.store = objectInstance.store.getSource();
+ }
+ dialog = Ext.create(this.objectDialog);
+ dialog.down('form').loadRecord(objectInstance);
+ dialog.show();
+ },
+
+ onEditClick: function () {
+ var dialog, objectInstance = this.getView().getSelectionModel().getSelection()[0];
+ dialog = Ext.create(this.objectDialog);
+ dialog.down('form').loadRecord(objectInstance);
+ dialog.show();
+ },
+
+ onRemoveClick: function () {
+ var objectInstance = this.getView().getSelectionModel().getSelection()[0];
+ Ext.Msg.show({
+ title: this.removeTitle,
+ message: Strings.sharedRemoveConfirm,
+ buttons: Ext.Msg.YESNO,
+ buttonText: {
+ yes: Strings.sharedRemove,
+ no: Strings.sharedCancel
+ },
+ fn: function (btn) {
+ var store = objectInstance.store;
+ if (btn === 'yes') {
+ store.remove(objectInstance);
+ store.sync({
+ failure: function (batch) {
+ store.rejectChanges();
+ Traccar.app.showError(batch.exceptions[0].getError().response);
+ }
+ });
+ }
+ }
+ });
+ },
+
+ onSelectionChange: function (selection, selected) {
+ var disabled = selected.length === 0;
+ this.lookupReference('toolbarEditButton').setDisabled(disabled);
+ this.lookupReference('toolbarRemoveButton').setDisabled(disabled);
+ }
+});
diff --git a/legacy/web/app/view/edit/Users.js b/legacy/web/app/view/edit/Users.js
new file mode 100644
index 00000000..5d9a14f0
--- /dev/null
+++ b/legacy/web/app/view/edit/Users.js
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2015 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.Users', {
+ extend: 'Traccar.view.GridPanel',
+ xtype: 'usersView',
+
+ requires: [
+ 'Traccar.view.edit.UsersController',
+ 'Traccar.view.edit.Toolbar'
+ ],
+
+ controller: 'users',
+ store: 'Users',
+
+ tbar: {
+ xtype: 'editToolbar',
+ scrollable: true,
+ items: [{
+ disabled: true,
+ handler: 'onGeofencesClick',
+ reference: 'userGeofencesButton',
+ glyph: 'xf21d@FontAwesome',
+ tooltip: Strings.sharedGeofences,
+ tooltipType: 'title'
+ }, {
+ disabled: true,
+ handler: 'onDevicesClick',
+ reference: 'userDevicesButton',
+ glyph: 'xf248@FontAwesome',
+ tooltip: Strings.deviceTitle,
+ tooltipType: 'title'
+ }, {
+ disabled: true,
+ handler: 'onGroupsClick',
+ reference: 'userGroupsButton',
+ glyph: 'xf247@FontAwesome',
+ tooltip: Strings.settingsGroups,
+ tooltipType: 'title'
+ }, {
+ disabled: true,
+ handler: 'onUsersClick',
+ reference: 'userUsersButton',
+ glyph: 'xf0c0@FontAwesome',
+ tooltip: Strings.settingsUsers,
+ tooltipType: 'title'
+ }, {
+ disabled: true,
+ handler: 'onNotificationsClick',
+ reference: 'userNotificationsButton',
+ glyph: 'xf003@FontAwesome',
+ tooltip: Strings.sharedNotifications,
+ tooltipType: 'title'
+ }, {
+ disabled: true,
+ handler: 'onCalendarsClick',
+ reference: 'userCalendarsButton',
+ glyph: 'xf073@FontAwesome',
+ tooltip: Strings.sharedCalendars,
+ tooltipType: 'title'
+ }, {
+ disabled: true,
+ handler: 'onAttributesClick',
+ reference: 'userAttributesButton',
+ glyph: 'xf0ae@FontAwesome',
+ tooltip: Strings.sharedComputedAttributes,
+ tooltipType: 'title'
+ }, {
+ disabled: true,
+ handler: 'onDriversClick',
+ reference: 'userDriversButton',
+ glyph: 'xf084@FontAwesome',
+ tooltip: Strings.sharedDrivers,
+ tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onCommandsClick',
+ reference: 'userCommandsButton',
+ glyph: 'xf093@FontAwesome',
+ tooltip: Strings.sharedSavedCommands,
+ tooltipType: 'title'
+ }, {
+ xtype: 'button',
+ disabled: true,
+ handler: 'onMaintenancesClick',
+ reference: 'userMaintenancesButton',
+ glyph: 'xf0ad@FontAwesome',
+ tooltip: Strings.sharedMaintenance,
+ tooltipType: 'title'
+ }]
+ },
+
+ listeners: {
+ selectionchange: 'onSelectionChange'
+ },
+
+ columns: {
+ defaults: {
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal
+ },
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ filter: 'string'
+ }, {
+ text: Strings.userEmail,
+ dataIndex: 'email',
+ filter: 'string'
+ }, {
+ text: Strings.userAdmin,
+ dataIndex: 'administrator',
+ renderer: Traccar.AttributeFormatter.getFormatter('administrator'),
+ filter: 'boolean'
+ }, {
+ text: Strings.serverReadonly,
+ dataIndex: 'readonly',
+ hidden: true,
+ renderer: Traccar.AttributeFormatter.getFormatter('readonly'),
+ filter: 'boolean'
+ }, {
+ text: Strings.userDeviceReadonly,
+ dataIndex: 'deviceReadonly',
+ renderer: Traccar.AttributeFormatter.getFormatter('deviceReadonly'),
+ hidden: true,
+ filter: 'boolean'
+ }, {
+ text: Strings.sharedDisabled,
+ dataIndex: 'disabled',
+ renderer: Traccar.AttributeFormatter.getFormatter('disabled'),
+ filter: 'boolean'
+ }, {
+ text: Strings.userExpirationTime,
+ dataIndex: 'expirationTime',
+ hidden: true,
+ renderer: Traccar.AttributeFormatter.getFormatter('expirationTime'),
+ filter: 'date'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/edit/UsersController.js b/legacy/web/app/view/edit/UsersController.js
new file mode 100644
index 00000000..9e810435
--- /dev/null
+++ b/legacy/web/app/view/edit/UsersController.js
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.edit.UsersController', {
+ extend: 'Traccar.view.edit.ToolbarController',
+ alias: 'controller.users',
+
+ requires: [
+ 'Traccar.view.dialog.User',
+ 'Traccar.view.permissions.Devices',
+ 'Traccar.view.permissions.Groups',
+ 'Traccar.view.permissions.Geofences',
+ 'Traccar.view.permissions.Calendars',
+ 'Traccar.view.permissions.Users',
+ 'Traccar.view.permissions.ComputedAttributes',
+ 'Traccar.view.permissions.Drivers',
+ 'Traccar.view.permissions.SavedCommands',
+ 'Traccar.view.permissions.Notifications',
+ 'Traccar.view.permissions.Maintenances',
+ 'Traccar.view.BaseWindow',
+ 'Traccar.model.User'
+ ],
+
+ objectModel: 'Traccar.model.User',
+ objectDialog: 'Traccar.view.dialog.User',
+ removeTitle: Strings.settingsUser,
+
+ init: function () {
+ Ext.getStore('Users').load();
+ this.lookupReference('userUsersButton').setHidden(!Traccar.app.getUser().get('administrator'));
+ this.lookupReference('userDriversButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableDrivers'));
+ this.lookupReference('userAttributesButton').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableComputedAttributes'));
+ this.lookupReference('userCalendarsButton').setHidden(
+ Traccar.app.getBooleanAttributePreference('ui.disableCalendars'));
+ this.lookupReference('userCommandsButton').setHidden(Traccar.app.getPreference('limitCommands', false));
+ this.lookupReference('userMaintenancesButton').setHidden(
+ Traccar.app.getVehicleFeaturesDisabled() || Traccar.app.getBooleanAttributePreference('ui.disableMaintenance'));
+ },
+
+ onEditClick: function () {
+ var dialog, user = this.getView().getSelectionModel().getSelection()[0];
+ dialog = Ext.create('Traccar.view.dialog.User', {
+ selfEdit: user.get('id') === Traccar.app.getUser().get('id')
+ });
+ dialog.down('form').loadRecord(user);
+ dialog.show();
+ },
+
+ onAddClick: function () {
+ var user, dialog;
+ user = Ext.create('Traccar.model.User');
+ if (Traccar.app.getUser().get('administrator')) {
+ user.set('deviceLimit', -1);
+ }
+ if (Traccar.app.getUser().get('expirationTime')) {
+ user.set('expirationTime', Traccar.app.getUser().get('expirationTime'));
+ }
+ dialog = Ext.create('Traccar.view.dialog.User');
+ dialog.down('form').loadRecord(user);
+ dialog.show();
+ },
+
+ onDevicesClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.getStore('AllGroups').load();
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.deviceTitle,
+ items: {
+ xtype: 'linkDevicesView',
+ baseObjectName: 'userId',
+ linkObjectName: 'deviceId',
+ storeName: 'AllDevices',
+ linkStoreName: 'Devices',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onGroupsClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.settingsGroups,
+ items: {
+ xtype: 'linkGroupsView',
+ baseObjectName: 'userId',
+ linkObjectName: 'groupId',
+ storeName: 'AllGroups',
+ linkStoreName: 'Groups',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onGeofencesClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedGeofences,
+ items: {
+ xtype: 'linkGeofencesView',
+ baseObjectName: 'userId',
+ linkObjectName: 'geofenceId',
+ storeName: 'AllGeofences',
+ linkStoreName: 'Geofences',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onNotificationsClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedNotifications,
+ items: {
+ xtype: 'linkNotificationsView',
+ baseObjectName: 'userId',
+ linkObjectName: 'notificationId',
+ storeName: 'AllNotifications',
+ linkStoreName: 'Notifications',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onCalendarsClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedCalendars,
+ items: {
+ xtype: 'linkCalendarsView',
+ baseObjectName: 'userId',
+ linkObjectName: 'calendarId',
+ storeName: 'AllCalendars',
+ linkStoreName: 'Calendars',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onUsersClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.settingsUsers,
+ items: {
+ xtype: 'linkUsersView',
+ baseObjectName: 'userId',
+ linkObjectName: 'managedUserId',
+ storeName: 'Users',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onAttributesClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedComputedAttributes,
+ items: {
+ xtype: 'linkComputedAttributesView',
+ baseObjectName: 'userId',
+ linkObjectName: 'attributeId',
+ storeName: 'AllComputedAttributes',
+ linkStoreName: 'ComputedAttributes',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onDriversClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedDrivers,
+ items: {
+ xtype: 'linkDriversView',
+ baseObjectName: 'userId',
+ linkObjectName: 'driverId',
+ storeName: 'AllDrivers',
+ linkStoreName: 'Drivers',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onCommandsClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedSavedCommands,
+ items: {
+ xtype: 'linkSavedCommandsView',
+ baseObjectName: 'userId',
+ linkObjectName: 'commandId',
+ storeName: 'AllCommands',
+ linkStoreName: 'Commands',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onMaintenancesClick: function () {
+ var user = this.getView().getSelectionModel().getSelection()[0];
+ Ext.create('Traccar.view.BaseWindow', {
+ title: Strings.sharedMaintenance,
+ items: {
+ xtype: 'linkMaintenancesView',
+ baseObjectName: 'userId',
+ linkObjectName: 'maintenanceId',
+ storeName: 'AllMaintenances',
+ linkStoreName: 'Maintenances',
+ baseObject: user.getId()
+ }
+ }).show();
+ },
+
+ onSelectionChange: function (selection, selected) {
+ var disabled = selected.length === 0;
+ this.lookupReference('userDevicesButton').setDisabled(disabled);
+ this.lookupReference('userGroupsButton').setDisabled(disabled);
+ this.lookupReference('userGeofencesButton').setDisabled(disabled);
+ this.lookupReference('userNotificationsButton').setDisabled(disabled);
+ this.lookupReference('userCalendarsButton').setDisabled(disabled);
+ this.lookupReference('userAttributesButton').setDisabled(disabled);
+ this.lookupReference('userDriversButton').setDisabled(disabled);
+ this.lookupReference('userCommandsButton').setDisabled(disabled);
+ this.lookupReference('userMaintenancesButton').setDisabled(disabled);
+ this.lookupReference('userUsersButton').setDisabled(disabled || selected[0].get('userLimit') === 0);
+ this.callParent(arguments);
+ }
+});
diff --git a/legacy/web/app/view/map/BaseMap.js b/legacy/web/app/view/map/BaseMap.js
new file mode 100644
index 00000000..9192a53b
--- /dev/null
+++ b/legacy/web/app/view/map/BaseMap.js
@@ -0,0 +1,243 @@
+/*
+ * Copyright 2016 - 2021 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.map.BaseMap', {
+ extend: 'Ext.panel.Panel',
+ xtype: 'baseMapView',
+
+ layout: 'fit',
+
+ getMap: function () {
+ return this.map;
+ },
+
+ getMapView: function () {
+ return this.mapView;
+ },
+
+ initMap: function () {
+ 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,
+ layers: [
+ new ol.layer.Tile({
+ title: Strings.mapCustom,
+ type: 'base',
+ visible: type === 'custom',
+ source: new ol.source.XYZ({
+ url: Ext.String.htmlDecode(server.get('mapUrl')),
+ attributions: ''
+ })
+ }),
+ new ol.layer.Tile({
+ title: Strings.mapCustomArcgis,
+ type: 'base',
+ visible: type === 'customArcgis',
+ source: new ol.source.TileArcGISRest({
+ url: Ext.String.htmlDecode(server.get('mapUrl'))
+ })
+ }),
+ new ol.layer.Tile({
+ title: Strings.mapBingRoad,
+ type: 'base',
+ visible: type === 'bingRoad',
+ source: new ol.source.BingMaps({
+ key: bingKey,
+ imagerySet: 'Road'
+ })
+ }),
+ new ol.layer.Tile({
+ title: Strings.mapBingAerial,
+ type: 'base',
+ visible: type === 'bingAerial',
+ source: new ol.source.BingMaps({
+ key: bingKey,
+ imagerySet: 'Aerial'
+ })
+ }),
+ new ol.layer.Tile({
+ title: Strings.mapBingHybrid,
+ type: 'base',
+ visible: type === 'bingHybrid',
+ source: new ol.source.BingMaps({
+ key: bingKey,
+ imagerySet: 'AerialWithLabels'
+ })
+ }),
+ new ol.layer.Tile({
+ title: Strings.mapCarto,
+ type: 'base',
+ visible: type === 'carto',
+ source: new ol.source.XYZ({
+ url: 'https://cartodb-basemaps-{a-d}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png',
+ attributions: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> ' +
+ 'contributors, &copy; <a href="https://carto.com/attributions">CARTO</a>'
+ })
+ }),
+ new ol.layer.Tile({
+ title: Strings.mapAutoNavi,
+ type: 'base',
+ visible: type === 'autoNavi' || type === 'baidu',
+ source: new ol.source.OSM({
+ url: 'https://webrd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'
+ })
+ }),
+ new ol.layer.Tile({
+ title: Strings.mapYandexMap,
+ type: 'base',
+ visible: type === 'yandexMap',
+ source: new ol.source.XYZ({
+ url: 'https://core-renderer-tiles.maps.yandex.net/tiles?l=map&x={x}&y={y}&z={z}',
+ projection: 'EPSG:3395',
+ attributions: '&copy; <a href="https://yandex.com/maps/">Yandex</a>'
+ })
+ }),
+ new ol.layer.Tile({
+ title: Strings.mapYandexSat,
+ type: 'base',
+ visible: type === 'yandexSat',
+ source: new ol.source.XYZ({
+ url: 'https://core-sat.maps.yandex.net/tiles?l=sat&x={x}&y={y}&z={z}',
+ projection: 'EPSG:3395',
+ attributions: '&copy; <a href="https://yandex.com/maps/">Yandex</a>'
+ })
+ }),
+ new ol.layer.Tile({
+ title: Strings.mapOsm,
+ type: 'base',
+ visible: type === 'osm',
+ source: new ol.source.OSM({})
+ }),
+ 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: '&copy; <a href="https://locationiq.com/">LocationIQ</a>'
+ })
+ })
+ ]
+ });
+
+ lat = Traccar.app.getPreference('latitude', Traccar.Style.mapDefaultLat);
+ lon = Traccar.app.getPreference('longitude', Traccar.Style.mapDefaultLon);
+ zoom = Traccar.app.getPreference('zoom', Traccar.Style.mapDefaultZoom);
+ maxZoom = Traccar.app.getAttributePreference('web.maxZoom', Traccar.Style.mapMaxZoom);
+
+ this.mapView = new ol.View({
+ center: ol.proj.fromLonLat([lon, lat]),
+ zoom: zoom,
+ maxZoom: maxZoom
+ });
+
+ this.map = new ol.Map({
+ target: this.body.dom.id,
+ layers: [layer],
+ view: this.mapView
+ });
+
+ poiLayer = Traccar.app.getPreference('poiLayer', null);
+
+ if (poiLayer) {
+ this.map.addLayer(new ol.layer.Vector({
+ source: new ol.source.Vector({
+ url: poiLayer,
+ format: new ol.format.KML()
+ })
+ }));
+ }
+
+ switch (Traccar.app.getAttributePreference('distanceUnit', 'km')) {
+ case 'mi':
+ this.map.addControl(new ol.control.ScaleLine({
+ units: 'us'
+ }));
+ break;
+ case 'nmi':
+ this.map.addControl(new ol.control.ScaleLine({
+ units: 'nautical'
+ }));
+ break;
+ default:
+ this.map.addControl(new ol.control.ScaleLine());
+ break;
+ }
+
+ this.map.addControl(new ol.control.LayerSwitcher());
+
+ target = this.map.getTarget();
+ if (typeof target === 'string') {
+ target = Ext.get(target).dom;
+ }
+
+ this.map.on('pointermove', function (e) {
+ var hit = this.forEachFeatureAtPixel(e.pixel, function () {
+ return true;
+ });
+ if (hit) {
+ target.style.cursor = 'pointer';
+ } else {
+ target.style.cursor = '';
+ }
+ });
+
+ this.map.on('click', function (e) {
+ var i, features = self.map.getFeaturesAtPixel(e.pixel, {
+ layerFilter: function (layer) {
+ return !layer.get('name');
+ }
+ });
+ if (features) {
+ for (i = 0; i < features.length; i++) {
+ self.fireEvent('selectfeature', features[i]);
+ }
+ } else {
+ self.fireEvent('deselectfeature');
+ }
+ });
+
+ this.map.once('postrender', function () {
+ self.fireEvent('mapready');
+ });
+ },
+
+ listeners: {
+ afterrender: function () {
+ this.initMap();
+ },
+
+ resize: function () {
+ this.map.updateSize();
+ }
+ }
+}, function () {
+ var projection;
+ proj4.defs('EPSG:3395', '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs');
+ ol.proj.proj4.register(proj4);
+ projection = ol.proj.get('EPSG:3395');
+ if (projection) {
+ projection.setExtent([-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244]);
+ }
+});
diff --git a/legacy/web/app/view/map/GeofenceMap.js b/legacy/web/app/view/map/GeofenceMap.js
new file mode 100644
index 00000000..cc1b7efe
--- /dev/null
+++ b/legacy/web/app/view/map/GeofenceMap.js
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2016 - 2021 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.map.GeofenceMap', {
+ extend: 'Traccar.view.map.BaseMap',
+ xtype: 'geofenceMapView',
+
+ requires: [
+ 'Traccar.view.map.GeofenceMapController',
+ 'Traccar.GeofenceConverter'
+ ],
+
+ controller: 'geofenceMap',
+ bodyBorder: true,
+
+ tbar: {
+ items: [{
+ xtype: 'combobox',
+ store: 'GeofenceTypes',
+ valueField: 'key',
+ displayField: 'name',
+ editable: false,
+ listeners: {
+ select: 'onTypeSelect'
+ }
+ }, '-', {
+ xtype: 'tbtext',
+ html: Strings.sharedImport
+ }, {
+ xtype: 'filefield',
+ name: 'file',
+ buttonConfig: {
+ glyph: 'xf093@FontAwesome',
+ text: '',
+ tooltip: Strings.sharedSelectFile,
+ tooltipType: 'title'
+ },
+ listeners: {
+ change: 'onFileChange',
+ afterrender: function (fileField) {
+ fileField.fileInputEl.set({
+ accept: '.gpx'
+ });
+ }
+ }
+ }, {
+ xtype: 'tbfill'
+ }, {
+ glyph: 'xf00c@FontAwesome',
+ tooltip: Strings.sharedSave,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onSaveClick'
+ }, {
+ glyph: 'xf00d@FontAwesome',
+ tooltip: Strings.sharedCancel,
+ tooltipType: 'title',
+ minWidth: 0,
+ handler: 'onCancelClick'
+ }]
+ },
+
+ getFeatures: function () {
+ return this.features;
+ },
+
+ initMap: function () {
+ var map, mapView, featureOverlay, geometry, fillColor;
+ this.callParent();
+
+ map = this.map;
+ mapView = this.mapView;
+
+ this.features = new ol.Collection();
+ if (this.area) {
+ geometry = Traccar.GeofenceConverter.wktToGeometry(mapView, this.area);
+ this.features.push(new ol.Feature(geometry));
+ this.map.once('postrender', function () {
+ mapView.fit(geometry, {
+ padding: [20, 20, 20, 20]
+ });
+ });
+ } else {
+ this.controller.fireEvent('mapstaterequest');
+ }
+ fillColor = ol.color.asArray(Traccar.Style.mapGeofenceColor);
+ fillColor[3] = Traccar.Style.mapGeofenceOverlayOpacity;
+ featureOverlay = new ol.layer.Vector({
+ source: new ol.source.Vector({
+ features: this.features
+ }),
+ style: new ol.style.Style({
+ fill: new ol.style.Fill({
+ color: fillColor
+ }),
+ stroke: new ol.style.Stroke({
+ color: Traccar.Style.mapGeofenceColor,
+ width: Traccar.Style.mapGeofenceWidth
+ }),
+ image: new ol.style.Circle({
+ radius: Traccar.Style.mapGeofenceRadius,
+ fill: new ol.style.Fill({
+ color: Traccar.Style.mapGeofenceColor
+ })
+ })
+ })
+ });
+ featureOverlay.setMap(map);
+
+ map.addInteraction(new ol.interaction.Modify({
+ features: this.features,
+ deleteCondition: function (event) {
+ return ol.events.condition.shiftKeyOnly(event) && ol.events.condition.singleClick(event);
+ }
+ }));
+ },
+
+ addInteraction: function (type) {
+ var self = this;
+ this.draw = new ol.interaction.Draw({
+ features: this.features,
+ type: type
+ });
+ this.draw.on('drawstart', function () {
+ self.features.clear();
+ });
+ this.map.addInteraction(this.draw);
+ },
+
+ removeInteraction: function () {
+ if (this.draw) {
+ this.map.removeInteraction(this.draw);
+ this.draw = null;
+ }
+ }
+});
diff --git a/legacy/web/app/view/map/GeofenceMapController.js b/legacy/web/app/view/map/GeofenceMapController.js
new file mode 100644
index 00000000..31ab586c
--- /dev/null
+++ b/legacy/web/app/view/map/GeofenceMapController.js
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.map.GeofenceMapController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.geofenceMap',
+
+ requires: [
+ 'Traccar.GeofenceConverter'
+ ],
+
+ config: {
+ listen: {
+ controller: {
+ '*': {
+ mapstate: 'setMapState'
+ }
+ }
+ }
+ },
+
+ onFileChange: function (fileField) {
+ var reader, view = this.getView();
+ if (fileField.fileInputEl.dom.files.length > 0) {
+ reader = new FileReader();
+ reader.onload = function () {
+ var parser, xml, segment, projection, points = [];
+ parser = new DOMParser();
+ xml = parser.parseFromString(reader.result, 'text/xml');
+ segment = xml.getElementsByTagName('trkseg')[0];
+ projection = view.mapView.getProjection();
+ Array.from(segment.getElementsByTagName('trkpt')).forEach(function (point) {
+ var lat, lon;
+ lat = Number(point.getAttribute('lat'));
+ lon = Number(point.getAttribute('lon'));
+ points.push(ol.proj.transform([lon, lat], 'EPSG:4326', projection));
+ });
+ view.getFeatures().clear();
+ view.getFeatures().push(new ol.Feature(new ol.geom.LineString(points)));
+ };
+ reader.onerror = function (event) {
+ Traccar.app.showError(event.target.error);
+ };
+ reader.readAsText(fileField.fileInputEl.dom.files[0]);
+ }
+ },
+
+ onSaveClick: function (button) {
+ var geometry, projection;
+ if (this.getView().getFeatures().getLength() > 0) {
+ geometry = this.getView().getFeatures().pop().getGeometry();
+ projection = this.getView().getMapView().getProjection();
+ this.fireEvent('savearea', Traccar.GeofenceConverter.geometryToWkt(projection, geometry));
+ button.up('window').close();
+ }
+ },
+
+ onCancelClick: function (button) {
+ button.up('window').close();
+ },
+
+ onTypeSelect: function (combo) {
+ this.getView().removeInteraction();
+ this.getView().addInteraction(combo.getValue());
+ },
+
+ setMapState: function (lat, lon, zoom) {
+ this.getView().getMapView().setCenter(ol.proj.fromLonLat([lon, lat]));
+ this.getView().getMapView().setZoom(zoom);
+ }
+});
diff --git a/legacy/web/app/view/map/Map.js b/legacy/web/app/view/map/Map.js
new file mode 100644
index 00000000..36e81de7
--- /dev/null
+++ b/legacy/web/app/view/map/Map.js
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.map.Map', {
+ extend: 'Traccar.view.map.BaseMap',
+ xtype: 'mapView',
+
+ requires: [
+ 'Traccar.view.map.MapController',
+ 'Traccar.view.SettingsMenu'
+ ],
+
+ controller: 'map',
+
+ title: Strings.mapTitle,
+ tbar: {
+ componentCls: 'toolbar-header-style',
+ defaults: {
+ xtype: 'button',
+ tooltipType: 'title',
+ stateEvents: ['toggle'],
+ enableToggle: true,
+ stateful: {
+ pressed: true
+ }
+ },
+ items: [{
+ xtype: 'tbtext',
+ html: Strings.mapTitle,
+ baseCls: 'x-panel-header-title-default'
+ }, {
+ xtype: 'tbfill'
+ }, {
+ handler: 'showReports',
+ reference: 'showReportsButton',
+ glyph: 'xf0f6@FontAwesome',
+ stateful: false,
+ enableToggle: false,
+ tooltip: Strings.reportTitle
+ }, {
+ handler: 'showEvents',
+ reference: 'showEventsButton',
+ glyph: 'xf27b@FontAwesome',
+ stateful: false,
+ enableToggle: false,
+ tooltip: Strings.reportEvents
+ }, {
+ handler: 'updateGeofences',
+ reference: 'showGeofencesButton',
+ glyph: 'xf21d@FontAwesome',
+ 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',
+ tooltip: Strings.mapCurrentLocation
+ }, {
+ handler: 'showLiveRoutes',
+ reference: 'showLiveRoutes',
+ glyph: 'xf1b0@FontAwesome',
+ stateId: 'show-live-routes-button',
+ tooltip: Strings.mapLiveRoutes
+ }, {
+ reference: 'deviceFollowButton',
+ glyph: 'xf05b@FontAwesome',
+ tooltip: Strings.deviceFollow,
+ stateId: 'device-follow-button',
+ toggleHandler: 'onFollowClick'
+ }, {
+ xtype: 'settingsMenu',
+ enableToggle: false
+ }]
+ },
+
+ getMarkersSource: function () {
+ return this.markersSource;
+ },
+
+ getAccuracySource: function () {
+ return this.accuracySource;
+ },
+
+ getAccuracyLayer: function () {
+ return this.accuracyLayer;
+ },
+
+ getRouteSource: function () {
+ return this.routeSource;
+ },
+
+ getGeofencesSource: function () {
+ return this.geofencesSource;
+ },
+
+ getLiveRouteSource: function () {
+ return this.liveRouteSource;
+ },
+
+ getLiveRouteLayer: function () {
+ return this.liveRouteLayer;
+ },
+
+ initMap: function () {
+ this.callParent();
+
+ this.geofencesSource = new ol.source.Vector({});
+ this.map.addLayer(new ol.layer.Vector({
+ name: 'geofencesLayer',
+ source: this.geofencesSource
+ }));
+
+ this.liveRouteSource = new ol.source.Vector({});
+ this.liveRouteLayer = new ol.layer.Vector({
+ source: this.liveRouteSource,
+ visible: this.lookupReference('showLiveRoutes').pressed
+ });
+ this.map.addLayer(this.liveRouteLayer);
+
+ this.routeSource = new ol.source.Vector({});
+ this.map.addLayer(new ol.layer.Vector({
+ source: this.routeSource
+ }));
+
+ this.accuracySource = new ol.source.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({
+ source: this.markersSource
+ }));
+ }
+});
diff --git a/legacy/web/app/view/map/MapController.js b/legacy/web/app/view/map/MapController.js
new file mode 100644
index 00000000..f6d88eed
--- /dev/null
+++ b/legacy/web/app/view/map/MapController.js
@@ -0,0 +1,101 @@
+/*
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.map.MapController', {
+ extend: 'Traccar.view.map.MapMarkerController',
+ alias: 'controller.map',
+
+ requires: [
+ 'Traccar.GeofenceConverter'
+ ],
+
+ config: {
+ listen: {
+ controller: {
+ '*': {
+ mapstaterequest: 'getMapState',
+ zoomtoalldevices: 'zoomToAllDevices'
+ }
+ },
+ store: {
+ '#Geofences': {
+ load: 'updateGeofences',
+ add: 'updateGeofences',
+ update: 'updateGeofences',
+ remove: 'updateGeofences'
+ }
+ }
+ }
+ },
+
+ init: function () {
+ this.callParent();
+ this.lookupReference('showReportsButton').setVisible(
+ Traccar.app.isMobile() && !Traccar.app.getPreference('disableReports', false));
+ this.lookupReference('showEventsButton').setVisible(
+ Traccar.app.isMobile() && !Traccar.app.getBooleanAttributePreference('ui.disableEvents'));
+ },
+
+ showReports: function () {
+ Traccar.app.showReports(true);
+ },
+
+ showEvents: function () {
+ Traccar.app.showEvents(true);
+ },
+
+ onFollowClick: function (button, pressed) {
+ if (pressed && this.selectedMarker) {
+ this.getView().getMapView().setCenter(this.selectedMarker.getGeometry().getCoordinates());
+ }
+ },
+
+ showLiveRoutes: function (button) {
+ 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();
+ center = ol.proj.transform(this.getView().getMapView().getCenter(), projection, 'EPSG:4326');
+ zoom = this.getView().getMapView().getZoom();
+ this.fireEvent('mapstate', center[1], center[0], zoom);
+ },
+
+ updateGeofences: function () {
+ this.getView().getGeofencesSource().clear();
+ if (this.lookupReference('showGeofencesButton').pressed) {
+ Ext.getStore('Geofences').each(function (geofence) {
+ var feature = new ol.Feature(
+ Traccar.GeofenceConverter.wktToGeometry(this.getView().getMapView(), geofence.get('area')));
+ feature.setStyle(this.getAreaStyle(
+ Ext.String.htmlDecode(geofence.get('name')),
+ geofence.get('attributes') ? geofence.get('attributes').color : null));
+ this.getView().getGeofencesSource().addFeature(feature);
+ return true;
+ }, this);
+ }
+ },
+
+ zoomToAllDevices: function () {
+ this.zoomToAllPositions(Ext.getStore('LatestPositions').getData().items);
+ }
+});
diff --git a/legacy/web/app/view/map/MapMarkerController.js b/legacy/web/app/view/map/MapMarkerController.js
new file mode 100644
index 00000000..2fef4870
--- /dev/null
+++ b/legacy/web/app/view/map/MapMarkerController.js
@@ -0,0 +1,687 @@
+/*
+ * Copyright 2015 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.map.MapMarkerController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.mapMarker',
+
+ requires: [
+ 'Traccar.model.Position',
+ 'Traccar.model.Device',
+ 'Traccar.DeviceImages'
+ ],
+
+ config: {
+ listen: {
+ controller: {
+ '*': {
+ selectdevice: 'selectDevice',
+ selectreport: 'selectReport',
+ selectevent: 'selectEvent'
+ },
+ 'devices': {
+ deselectfeature: 'deselectDevice'
+ }
+ },
+ store: {
+ '#Devices': {
+ add: 'updateDevice',
+ update: 'updateDevice',
+ remove: 'removeDevice'
+ },
+ '#VisibleDevices': {
+ add: 'updateVisibleDevices',
+ update: 'updateVisibleDevices',
+ remove: 'updateVisibleDevices',
+ refresh: 'filterDevices'
+ },
+ '#LatestPositions': {
+ add: 'updateLatest',
+ update: 'updateLatest'
+ },
+ '#ReportRoute': {
+ add: 'addReportMarkers',
+ load: 'loadReport',
+ clear: 'clearReport'
+ },
+ '#Events': {
+ remove: 'clearEvent',
+ clear: 'clearEvent'
+ }
+ },
+ component: {
+ '#': {
+ mapready: 'initGeolocation',
+ selectfeature: 'selectFeature',
+ deselectfeature: 'deselectFeature'
+ }
+ }
+ }
+ },
+
+ init: function () {
+ this.latestMarkers = {};
+ this.reportMarkers = {};
+ this.accuracyCircles = {};
+ this.liveRoutes = {};
+ this.liveRouteLength = Traccar.app.getAttributePreference('web.liveRouteLength', 10);
+ this.selectZoom = Traccar.app.getAttributePreference('web.selectZoom', 0);
+ },
+
+ initGeolocation: function () {
+ var geolocation, accuracyFeature, positionFeature;
+
+ geolocation = new ol.Geolocation({
+ trackingOptions: {
+ enableHighAccuracy: true
+ },
+ projection: this.getView().getMapView().getProjection()
+ });
+
+ geolocation.on('error', function (error) {
+ Traccar.app.showError(error.message);
+ });
+
+ accuracyFeature = new ol.Feature();
+ geolocation.on('change:accuracyGeometry', function () {
+ accuracyFeature.setGeometry(geolocation.getAccuracyGeometry());
+ });
+
+ positionFeature = new ol.Feature();
+ positionFeature.setStyle(new ol.style.Style({
+ image: new ol.style.Circle({
+ radius: 6,
+ fill: new ol.style.Fill({
+ color: '#3399CC'
+ }),
+ stroke: new ol.style.Stroke({
+ color: '#fff',
+ width: 2
+ })
+ })
+ }));
+
+ geolocation.on('change:position', function () {
+ var coordinates = geolocation.getPosition();
+ positionFeature.setGeometry(coordinates ? new ol.geom.Point(coordinates) : null);
+ });
+
+ this.getView().getAccuracySource().addFeature(accuracyFeature);
+ this.getView().getMarkersSource().addFeature(positionFeature);
+
+ this.geolocation = geolocation;
+ },
+
+ showCurrentLocation: function (view) {
+ this.geolocation.setTracking(view.pressed);
+ },
+
+ getAreaStyle: function (label, color) {
+ var fillColor, strokeColor, styleConfig;
+ if (color) {
+ fillColor = ol.color.asArray(color);
+ strokeColor = color;
+ } else {
+ fillColor = ol.color.asArray(Traccar.Style.mapGeofenceColor);
+ strokeColor = Traccar.Style.mapGeofenceColor;
+ }
+ fillColor[3] = Traccar.Style.mapGeofenceOverlayOpacity;
+ styleConfig = {
+ fill: new ol.style.Fill({
+ color: fillColor
+ }),
+ stroke: new ol.style.Stroke({
+ color: strokeColor,
+ width: Traccar.Style.mapGeofenceWidth
+ })
+ };
+ if (label) {
+ styleConfig.text = new ol.style.Text({
+ text: label,
+ overflow: true,
+ fill: new ol.style.Fill({
+ color: Traccar.Style.mapGeofenceTextColor
+ }),
+ stroke: new ol.style.Stroke({
+ color: Traccar.Style.mapTextStrokeColor,
+ width: Traccar.Style.mapTextStrokeWidth
+ }),
+ font: Traccar.Style.mapTextFont
+ });
+ }
+ return new ol.style.Style(styleConfig);
+ },
+
+ getDeviceColor: function (device) {
+ switch (device.get('status')) {
+ case 'online':
+ return Traccar.Style.mapColorOnline;
+ case 'offline':
+ return Traccar.Style.mapColorOffline;
+ default:
+ return Traccar.Style.mapColorUnknown;
+ }
+ },
+
+ updateDevice: function (store, data) {
+ var i, device, deviceId, deviceName, marker, style;
+
+ if (!Ext.isArray(data)) {
+ data = [data];
+ }
+
+ for (i = 0; i < data.length; i++) {
+ device = data[i];
+ deviceId = device.get('id');
+
+ if (deviceId in this.latestMarkers) {
+ marker = this.latestMarkers[deviceId];
+ style = marker.getStyle();
+ if (style.getImage().fill !== this.getDeviceColor(device) ||
+ style.getImage().category !== device.get('category')) {
+ this.updateDeviceMarker(style, this.getDeviceColor(device), device.get('category'));
+ marker.changed();
+ }
+ deviceName = Ext.String.htmlDecode(device.get('name'));
+ if (style.getText().getText() !== deviceName) {
+ style.getText().setText(deviceName);
+ marker.changed();
+ }
+ }
+ }
+ },
+
+ removeDevice: function (store, data) {
+ var i, deviceId, markersSource;
+ if (!Ext.isArray(data)) {
+ data = [data];
+ }
+
+ markersSource = this.getView().getMarkersSource();
+
+ for (i = 0; i < data.length; i++) {
+ deviceId = data[i].get('id');
+ if (this.latestMarkers[deviceId]) {
+ if (markersSource.getFeatureById(this.latestMarkers[deviceId].getId())) {
+ markersSource.removeFeature(this.latestMarkers[deviceId]);
+ }
+ delete this.latestMarkers[deviceId];
+ }
+ if (this.accuracyCircles[deviceId]) {
+ if (markersSource.getFeatureById(this.accuracyCircles[deviceId].getId())) {
+ markersSource.removeFeature(this.accuracyCircles[deviceId]);
+ }
+ delete this.accuracyCircles[deviceId];
+ }
+ if (this.liveRoutes[deviceId]) {
+ if (markersSource.getFeatureById(this.liveRoutes[deviceId].getId())) {
+ markersSource.removeFeature(this.liveRoutes[deviceId]);
+ }
+ delete this.liveRoutes[deviceId];
+ }
+ }
+ },
+
+ animateMarker: function (marker, geometry, course) {
+ var start, end, duration, timeout, line, updatePosition, self, follow;
+
+ start = marker.getGeometry().getCoordinates();
+ end = geometry.getCoordinates();
+ line = new ol.geom.LineString([start, end]);
+ duration = Traccar.Style.mapAnimateMarkerDuration;
+ timeout = Traccar.Style.mapAnimateMarkerTimeout;
+ self = this;
+ follow = this.lookupReference('deviceFollowButton').pressed;
+
+ updatePosition = function (position, marker) {
+ var coordinate, style;
+ coordinate = marker.get('line').getCoordinateAt(position / (duration / timeout));
+ style = marker.getStyle();
+ marker.setGeometry(new ol.geom.Point(coordinate));
+ if (marker === self.selectedMarker && follow) {
+ self.getView().getMapView().setCenter(marker.getGeometry().getCoordinates());
+ }
+ if (position < duration / timeout) {
+ setTimeout(updatePosition, timeout, position + 1, marker);
+ } else {
+ if (style.getImage().angle !== marker.get('nextCourse')) {
+ self.rotateMarker(style, marker.get('nextCourse'));
+ }
+ marker.set('animating', false);
+ }
+ };
+
+ marker.set('line', line);
+ marker.set('nextCourse', course);
+ if (!marker.get('animating')) {
+ marker.set('animating', true);
+ updatePosition(1, marker);
+ }
+ },
+
+ updateLatest: function (store, data) {
+ var i, position, device, deviceStore;
+
+ if (!Ext.isArray(data)) {
+ data = [data];
+ }
+
+ deviceStore = Ext.getStore('Devices');
+
+ for (i = 0; i < data.length; i++) {
+ position = data[i];
+ device = deviceStore.getById(position.get('deviceId'));
+
+ if (device) {
+ this.updateAccuracy(position, device);
+ this.updateLatestMarker(position, device);
+ this.updateLiveRoute(position, device);
+ }
+ }
+ },
+
+ updateAccuracy: function (position, device) {
+ var center, radius, feature;
+ feature = this.accuracyCircles[position.get('deviceId')];
+
+ if (position.get('accuracy')) {
+ center = ol.proj.fromLonLat([position.get('longitude'), position.get('latitude')]);
+ radius = Ext.getStore('DistanceUnits').convertValue(
+ position.get('accuracy'), Traccar.app.getAttributePreference('distanceUnit'), true);
+
+ if (feature) {
+ feature.getGeometry().setCenter(center);
+ feature.getGeometry().setRadius(radius);
+ } else {
+ feature = new ol.Feature(new ol.geom.Circle(center, radius));
+ feature.setStyle(this.getAreaStyle(null, Traccar.Style.mapAccuracyColor));
+ feature.setId(position.get('deviceId'));
+ this.accuracyCircles[position.get('deviceId')] = feature;
+ if (this.isDeviceVisible(device)) {
+ this.getView().getAccuracySource().addFeature(feature);
+ }
+ }
+ } else {
+ if (feature && this.getView().getAccuracySource().getFeatureById(feature.getId())) {
+ this.getView().getAccuracySource().removeFeature(feature);
+ }
+ delete this.accuracyCircles[position.get('deviceId')];
+ }
+ },
+
+ updateLatestMarker: function (position, device) {
+ var geometry, deviceId, marker, style;
+ geometry = new ol.geom.Point(ol.proj.fromLonLat([
+ position.get('longitude'),
+ position.get('latitude')
+ ]));
+ deviceId = position.get('deviceId');
+ if (deviceId in this.latestMarkers) {
+ marker = this.latestMarkers[deviceId];
+ this.animateMarker(marker, geometry, position.get('course'));
+ } else {
+ marker = new ol.Feature(geometry);
+ marker.set('record', device);
+
+ style = this.getLatestMarker(this.getDeviceColor(device),
+ position.get('course'),
+ device.get('category'));
+ style.getText().setText(Ext.String.htmlDecode(device.get('name')));
+ marker.setStyle(style);
+ marker.setId(device.get('id'));
+ this.latestMarkers[deviceId] = marker;
+ if (this.isDeviceVisible(device)) {
+ this.getView().getMarkersSource().addFeature(marker);
+ }
+ if (marker === this.selectedMarker && this.lookupReference('deviceFollowButton').pressed) {
+ this.getView().getMapView().setCenter(marker.getGeometry().getCoordinates());
+ }
+ }
+ },
+
+ updateLiveRoute: function (position, device) {
+ var deviceId, liveLine, liveCoordinates, lastLiveCoordinates, newCoordinates;
+ deviceId = position.get('deviceId');
+ if (deviceId in this.liveRoutes) {
+ liveCoordinates = this.liveRoutes[deviceId].getGeometry().getCoordinates();
+ lastLiveCoordinates = liveCoordinates[liveCoordinates.length - 1];
+ newCoordinates = ol.proj.fromLonLat([position.get('longitude'), position.get('latitude')]);
+ if (lastLiveCoordinates[0] === newCoordinates[0] &&
+ lastLiveCoordinates[1] === newCoordinates[1]) {
+ return;
+ }
+ if (liveCoordinates.length >= this.liveRouteLength) {
+ liveCoordinates.shift();
+ }
+ liveCoordinates.push(newCoordinates);
+ this.liveRoutes[deviceId].getGeometry().setCoordinates(liveCoordinates);
+ } else {
+ liveLine = new ol.Feature({
+ geometry: new ol.geom.LineString([
+ ol.proj.fromLonLat([
+ position.get('longitude'),
+ position.get('latitude')
+ ])
+ ])
+ });
+ liveLine.setStyle(this.getRouteStyle(deviceId));
+ liveLine.setId(deviceId);
+ this.liveRoutes[deviceId] = liveLine;
+ if (this.isDeviceVisible(device)) {
+ this.getView().getMarkersSource().addFeature(liveLine);
+ }
+ }
+ },
+
+ loadReport: function (store, data) {
+ var i, position, point, routeSource;
+ if (data) {
+ this.addReportMarkers(store, data);
+ routeSource = this.getView().getRouteSource();
+
+ this.reportRoute = [];
+ for (i = 0; i < data.length; i++) {
+ position = data[i];
+ point = ol.proj.fromLonLat([
+ position.get('longitude'),
+ position.get('latitude')
+ ]);
+ if (i === 0 || data[i].get('deviceId') !== data[i - 1].get('deviceId')) {
+ this.reportRoute.push(new ol.Feature({
+ geometry: new ol.geom.LineString([])
+ }));
+ this.reportRoute[this.reportRoute.length - 1].setStyle(this.getRouteStyle(data[i].get('deviceId')));
+ routeSource.addFeature(this.reportRoute[this.reportRoute.length - 1]);
+ }
+ this.reportRoute[this.reportRoute.length - 1].getGeometry().appendCoordinate(point);
+ }
+ }
+ },
+
+ addReportMarker: function (position) {
+ var geometry, marker, style, point = ol.proj.fromLonLat([
+ position.get('longitude'),
+ position.get('latitude')
+ ]);
+ geometry = new ol.geom.Point(point);
+ marker = new ol.Feature(geometry);
+ marker.set('record', position);
+ style = this.getReportMarker(position.get('deviceId'), position.get('course'));
+ marker.setStyle(style);
+ this.getView().getMarkersSource().addFeature(marker);
+ return marker;
+ },
+
+ addReportMarkers: function (store, data) {
+ var i;
+ this.clearReport();
+ for (i = 0; i < data.length; i++) {
+ if (store.showMarkers) {
+ this.reportMarkers[data[i].get('id')] = this.addReportMarker(data[i]);
+ }
+ }
+ this.zoomToAllPositions(data);
+ },
+
+ clearReport: function () {
+ var key, i, reportSource, markersSource;
+
+ reportSource = this.getView().getRouteSource();
+
+ if (this.reportRoute) {
+ for (i = 0; i < this.reportRoute.length; i++) {
+ reportSource.removeFeature(this.reportRoute[i]);
+ }
+ this.reportRoute = null;
+ }
+
+ if (this.reportMarkers) {
+ markersSource = this.getView().getMarkersSource();
+ for (key in this.reportMarkers) {
+ if (this.reportMarkers.hasOwnProperty(key)) {
+ markersSource.removeFeature(this.reportMarkers[key]);
+ }
+ }
+ this.reportMarkers = {};
+ }
+
+ if (this.selectedMarker && !this.selectedMarker.get('event') &&
+ this.selectedMarker.get('record') instanceof Traccar.model.Position) {
+ this.selectedMarker = null;
+ }
+ },
+
+ clearEvent: function () {
+ if (this.selectedMarker && this.selectedMarker.get('event')) {
+ this.selectMarker(null, false);
+ }
+ },
+
+ getRouteStyle: function (deviceId) {
+ return new ol.style.Style({
+ stroke: new ol.style.Stroke({
+ color: Traccar.app.getReportColor(deviceId),
+ width: Traccar.Style.mapRouteWidth
+ })
+ });
+ },
+
+ getMarkerStyle: function (zoom, color, angle, category) {
+ var image = Traccar.DeviceImages.getImageIcon(color, zoom, angle, category);
+ return new ol.style.Style({
+ image: image,
+ text: new ol.style.Text({
+ textBaseline: 'bottom',
+ fill: new ol.style.Fill({
+ color: Traccar.Style.mapTextColor
+ }),
+ stroke: new ol.style.Stroke({
+ color: Traccar.Style.mapTextStrokeColor,
+ width: Traccar.Style.mapTextStrokeWidth
+ }),
+ offsetY: -image.getSize()[1] / 2 - Traccar.Style.mapTextOffset,
+ font: Traccar.Style.mapTextFont
+ })
+ });
+ },
+
+ getLatestMarker: function (color, angle, category) {
+ return this.getMarkerStyle(false, color, angle, category);
+ },
+
+ getReportMarker: function (deviceId, angle) {
+ return this.getMarkerStyle(false, Traccar.app.getReportColor(deviceId), angle, 'arrow');
+ },
+
+ resizeMarker: function (style, zoom) {
+ var image, text;
+ image = Traccar.DeviceImages.getImageIcon(
+ style.getImage().fill, zoom, style.getImage().angle, style.getImage().category);
+ text = style.getText();
+ text.setOffsetY(-image.getSize()[1] / 2 - Traccar.Style.mapTextOffset);
+ style.setText(text);
+ style.setImage(image);
+ },
+
+ rotateMarker: function (style, angle) {
+ style.setImage(Traccar.DeviceImages.getImageIcon(
+ style.getImage().fill, style.getImage().zoom, angle, style.getImage().category));
+ },
+
+ updateDeviceMarker: function (style, color, category) {
+ var image, text;
+ image = Traccar.DeviceImages.getImageIcon(
+ color, style.getImage().zoom, style.getImage().angle, category);
+ text = style.getText();
+ text.setOffsetY(-image.getSize()[1] / 2 - Traccar.Style.mapTextOffset);
+ style.setText(text);
+ style.setImage(image);
+ },
+
+ selectMarker: function (marker, center) {
+ if (this.selectedMarker) {
+ if (this.selectedMarker.get('event')) {
+ this.getView().getMarkersSource().removeFeature(this.selectedMarker);
+ } else if (!Ext.getStore('ReportRoute').showMarkers &&
+ this.selectedMarker.get('record') instanceof Traccar.model.Position) {
+ this.getView().getMarkersSource().removeFeature(this.selectedMarker);
+ delete this.reportMarkers[this.selectedMarker.get('record').get('id')];
+ } else {
+ this.resizeMarker(this.selectedMarker.getStyle(), false);
+ this.selectedMarker.getStyle().setZIndex(0);
+ this.selectedMarker.changed();
+ }
+ }
+
+ if (marker) {
+ this.resizeMarker(marker.getStyle(), true);
+ marker.getStyle().setZIndex(1);
+ marker.changed();
+ if (center) {
+ this.getView().getMapView().setCenter(marker.getGeometry().getCoordinates());
+ if (this.selectZoom !== 0 && this.selectZoom > this.getView().getMapView().getZoom()) {
+ this.getView().getMapView().setZoom(this.selectZoom);
+ }
+ }
+ }
+
+ this.selectedMarker = marker;
+ },
+
+ selectDevice: function (device, center) {
+ this.selectMarker(this.latestMarkers[device.get('id')], center);
+ },
+
+ selectReport: function (position, center) {
+ if (position instanceof Traccar.model.Position) {
+ if (!Ext.getStore('ReportRoute').showMarkers) {
+ this.reportMarkers[position.get('id')] = this.addReportMarker(position);
+ }
+ this.selectMarker(this.reportMarkers[position.get('id')], center);
+ } else if (this.selectedMarker) {
+ this.selectMarker(null, false);
+ }
+ },
+
+ selectEvent: function (position) {
+ var marker;
+ if (position) {
+ marker = this.addReportMarker(position);
+ marker.set('event', true);
+ this.selectMarker(marker, true);
+ } else if (this.selectedMarker && this.selectedMarker.get('event')) {
+ this.selectMarker(null, false);
+ }
+ },
+
+ selectFeature: function (feature) {
+ var record = feature.get('record');
+ if (record) {
+ if (record instanceof Traccar.model.Device) {
+ this.fireEvent('selectdevice', record, false);
+ } else {
+ this.fireEvent('selectreport', record, false);
+ }
+ }
+ },
+
+ deselectFeature: function () {
+ this.deselectDevice();
+ this.fireEvent('deselectfeature');
+ },
+
+ deselectDevice: function () {
+ this.selectMarker(null, false);
+ },
+
+ zoomToAllPositions: function (data) {
+ var i, point, minx, miny, maxx, maxy;
+ for (i = 0; i < data.length; i++) {
+ point = ol.proj.fromLonLat([
+ data[i].get('longitude'),
+ data[i].get('latitude')
+ ]);
+ if (i === 0) {
+ minx = maxx = point[0];
+ miny = maxy = point[1];
+ } else {
+ minx = Math.min(point[0], minx);
+ miny = Math.min(point[1], miny);
+ maxx = Math.max(point[0], maxx);
+ maxy = Math.max(point[1], maxy);
+ }
+ }
+ if (minx !== maxx || miny !== maxy) {
+ this.getView().getMapView().fit([minx, miny, maxx, maxy]);
+ } else if (point) {
+ this.getView().getMapView().fit(new ol.geom.Point(point));
+ }
+ },
+
+ updateVisibleDevices: function (store, data) {
+ var i, device;
+
+ if (!Ext.isArray(data)) {
+ data = [data];
+ }
+
+ for (i = 0; i < data.length; i++) {
+ device = data[i];
+ if (device.get('id') in this.latestMarkers) {
+ this.updateDeviceVisibility(device);
+ }
+ }
+ },
+
+ isDeviceVisible: function (device) {
+ return Ext.getStore('VisibleDevices').contains(device);
+ },
+
+ updateDeviceVisibility: function (device) {
+ var deviceId, accuracy, liveLine, marker;
+ deviceId = device.get('id');
+ marker = this.latestMarkers[deviceId];
+ accuracy = this.accuracyCircles[deviceId];
+ liveLine = this.liveRoutes[deviceId];
+ if (this.isDeviceVisible(device)) {
+ if (marker && !this.getView().getMarkersSource().getFeatureById(marker.getId())) {
+ this.getView().getMarkersSource().addFeature(marker);
+ }
+ if (accuracy && !this.getView().getAccuracySource().getFeatureById(accuracy.getId())) {
+ this.getView().getAccuracySource().addFeature(accuracy);
+ }
+ if (liveLine && !this.getView().getLiveRouteSource().getFeatureById(liveLine.getId())) {
+ this.getView().getLiveRouteSource().addFeature(liveLine);
+ }
+ } else {
+ if (marker && this.getView().getMarkersSource().getFeatureById(marker.getId())) {
+ this.getView().getMarkersSource().removeFeature(marker);
+ }
+ if (accuracy && this.getView().getAccuracySource().getFeatureById(accuracy.getId())) {
+ this.getView().getAccuracySource().removeFeature(accuracy);
+ }
+ if (liveLine && this.getView().getLiveRouteSource().getFeatureById(liveLine.getId())) {
+ this.getView().getLiveRouteSource().removeFeature(liveLine);
+ }
+ }
+ },
+
+ filterDevices: function () {
+ Ext.getStore('Devices').each(this.updateDeviceVisibility, this, false);
+ }
+});
diff --git a/legacy/web/app/view/permissions/Base.js b/legacy/web/app/view/permissions/Base.js
new file mode 100644
index 00000000..57017531
--- /dev/null
+++ b/legacy/web/app/view/permissions/Base.js
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+Ext.define('Traccar.view.permissions.Base', {
+ extend: 'Traccar.view.GridPanel',
+
+ requires: [
+ 'Traccar.view.permissions.BaseController'
+ ],
+
+ controller: 'base',
+
+ selModel: {
+ selType: 'checkboxmodel',
+ checkOnly: true,
+ showHeaderCheckbox: false
+ },
+
+ listeners: {
+ beforedeselect: 'onBeforeDeselect',
+ beforeselect: 'onBeforeSelect'
+ }
+});
diff --git a/legacy/web/app/view/permissions/BaseController.js b/legacy/web/app/view/permissions/BaseController.js
new file mode 100644
index 00000000..5cb9c302
--- /dev/null
+++ b/legacy/web/app/view/permissions/BaseController.js
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.BaseController', {
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.base',
+
+ init: function () {
+ var params = {}, linkStoreName, storeName;
+ params[this.getView().baseObjectName] = this.getView().baseObject;
+ linkStoreName = this.getView().linkStoreName;
+ storeName = this.getView().storeName;
+ linkStoreName = typeof linkStoreName === 'undefined' ? storeName : linkStoreName;
+ this.getView().setStore(Ext.getStore(storeName));
+ this.getView().getStore().load({
+ scope: this,
+ callback: function () {
+ var linkStore = Ext.create('Traccar.store.' + linkStoreName);
+ linkStore.load({
+ params: params,
+ scope: this,
+ callback: function (records, operation, success) {
+ var i, index;
+ if (success) {
+ for (i = 0; i < records.length; i++) {
+ index = this.getView().getStore().getById(records[i].getId());
+ this.getView().getSelectionModel().select(index, true, true);
+ }
+ }
+ }
+ });
+ }
+ });
+ },
+
+ onBeforeSelect: function (selection, record) {
+ var data = {};
+ data[this.getView().baseObjectName] = this.getView().baseObject;
+ data[this.getView().linkObjectName] = record.getId();
+ Ext.Ajax.request({
+ scope: this,
+ url: 'api/permissions',
+ jsonData: Ext.util.JSON.encode(data),
+ callback: function (options, success, response) {
+ if (!success) {
+ selection.deselect(record, true);
+ Traccar.app.showError(response);
+ }
+ }
+ });
+ },
+
+ onBeforeDeselect: function (selection, record) {
+ var data = {};
+ data[this.getView().baseObjectName] = this.getView().baseObject;
+ data[this.getView().linkObjectName] = record.getId();
+ Ext.Ajax.request({
+ scope: this,
+ method: 'DELETE',
+ url: 'api/permissions',
+ jsonData: Ext.util.JSON.encode(data),
+ callback: function (options, success, response) {
+ if (!success) {
+ selection.select(record, true, true);
+ Traccar.app.showError(response);
+ }
+ }
+ });
+ }
+});
diff --git a/legacy/web/app/view/permissions/Calendars.js b/legacy/web/app/view/permissions/Calendars.js
new file mode 100644
index 00000000..3d08efca
--- /dev/null
+++ b/legacy/web/app/view/permissions/Calendars.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2016 - 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.Calendars', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkCalendarsView',
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/permissions/ComputedAttributes.js b/legacy/web/app/view/permissions/ComputedAttributes.js
new file mode 100644
index 00000000..19af72ad
--- /dev/null
+++ b/legacy/web/app/view/permissions/ComputedAttributes.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.ComputedAttributes', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkComputedAttributesView',
+
+ columns: {
+ items: [{
+ text: Strings.sharedDescription,
+ dataIndex: 'description',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.sharedAttribute,
+ dataIndex: 'attribute',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'PositionAttributes'
+ },
+ renderer: function (value) {
+ return Ext.getStore('PositionAttributes').getAttributeName(value);
+ }
+ }]
+ }
+});
diff --git a/legacy/web/app/view/permissions/Devices.js b/legacy/web/app/view/permissions/Devices.js
new file mode 100644
index 00000000..3180b107
--- /dev/null
+++ b/legacy/web/app/view/permissions/Devices.js
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2015 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.Devices', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkDevicesView',
+
+ requires: [
+ 'Traccar.AttributeFormatter'
+ ],
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.deviceIdentifier,
+ dataIndex: 'uniqueId',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.sharedPhone,
+ dataIndex: 'phone',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ hidden: true,
+ filter: 'string'
+ }, {
+ text: Strings.deviceModel,
+ dataIndex: 'model',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ hidden: true,
+ filter: 'string'
+ }, {
+ text: Strings.deviceContact,
+ dataIndex: 'contact',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ hidden: true,
+ filter: 'string'
+ }, {
+ text: Strings.sharedDisabled,
+ dataIndex: 'disabled',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ renderer: Traccar.AttributeFormatter.getFormatter('disabled'),
+ hidden: true,
+ filter: 'boolean'
+ }, {
+ text: Strings.groupDialog,
+ dataIndex: 'groupId',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ hidden: true,
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'AllGroups'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('groupId')
+ }]
+ }
+});
diff --git a/legacy/web/app/view/permissions/Drivers.js b/legacy/web/app/view/permissions/Drivers.js
new file mode 100644
index 00000000..33cf2f76
--- /dev/null
+++ b/legacy/web/app/view/permissions/Drivers.js
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.Drivers', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkDriversView',
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.deviceIdentifier,
+ dataIndex: 'uniqueId',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/permissions/Geofences.js b/legacy/web/app/view/permissions/Geofences.js
new file mode 100644
index 00000000..e2e85a36
--- /dev/null
+++ b/legacy/web/app/view/permissions/Geofences.js
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2016 - 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.Geofences', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkGeofencesView',
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.sharedCalendar,
+ dataIndex: 'calendarId',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ hidden: true,
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'AllCalendars'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('calendarId')
+ }]
+ }
+});
diff --git a/legacy/web/app/view/permissions/Groups.js b/legacy/web/app/view/permissions/Groups.js
new file mode 100644
index 00000000..91a639c0
--- /dev/null
+++ b/legacy/web/app/view/permissions/Groups.js
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016 - 2017 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.Groups', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkGroupsView',
+
+ requires: [
+ 'Traccar.AttributeFormatter'
+ ],
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.groupDialog,
+ dataIndex: 'groupId',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ hidden: true,
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'AllGroups'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('groupId')
+ }]
+ }
+});
diff --git a/legacy/web/app/view/permissions/Maintenances.js b/legacy/web/app/view/permissions/Maintenances.js
new file mode 100644
index 00000000..c5255769
--- /dev/null
+++ b/legacy/web/app/view/permissions/Maintenances.js
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.Maintenances', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkMaintenancesView',
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.sharedType,
+ dataIndex: 'type',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: {
+ type: 'list',
+ idField: 'key',
+ labelField: 'name',
+ store: 'MaintenanceTypes'
+ },
+ renderer: function (value) {
+ var attribute = Ext.getStore('MaintenanceTypes').getById(value);
+ return attribute && attribute.get('name') || value;
+ }
+ }, {
+ text: Strings.maintenanceStart,
+ dataIndex: 'start',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ renderer: function (value, metaData, record) {
+ return Traccar.AttributeFormatter.renderAttribute(
+ value, Ext.getStore('MaintenanceTypes').getById(record.get('type')));
+ }
+ }, {
+ text: Strings.maintenancePeriod,
+ dataIndex: 'period',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ renderer: function (value, metaData, record) {
+ return Traccar.AttributeFormatter.renderAttribute(
+ value, Ext.getStore('MaintenanceTypes').getById(record.get('type')));
+ }
+ }]
+ }
+});
diff --git a/legacy/web/app/view/permissions/Notifications.js b/legacy/web/app/view/permissions/Notifications.js
new file mode 100644
index 00000000..a8570fea
--- /dev/null
+++ b/legacy/web/app/view/permissions/Notifications.js
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2017 - 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 - 2018 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.Notifications', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkNotificationsView',
+
+ columns: {
+ items: [{
+ text: Strings.notificationType,
+ dataIndex: 'type',
+ flex: 2,
+ renderer: function (value) {
+ return Traccar.app.getEventString(value);
+ },
+ filter: {
+ type: 'list',
+ idField: 'type',
+ labelField: 'name',
+ store: 'AllNotificationTypes'
+ }
+ }, {
+ text: Strings.notificationAlways,
+ dataIndex: 'always',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ renderer: Traccar.AttributeFormatter.getFormatter('always'),
+ filter: 'boolean'
+ }, {
+ text: Strings.notificationNotificators,
+ dataIndex: 'notificators',
+ flex: 2,
+ filter: {
+ type: 'arraylist',
+ idField: 'type',
+ labelField: 'name',
+ store: 'AllNotificators'
+ },
+ renderer: function (value) {
+ var result = '', i, notificators;
+ if (value) {
+ notificators = value.split(/[ ,]+/).filter(Boolean);
+ for (i = 0; i < notificators.length; i++) {
+ result += Traccar.app.getNotificatorString(notificators[i]) + (i < notificators.length - 1 ? ', ' : '');
+ }
+ }
+ return result;
+ }
+ }, {
+ text: Strings.sharedCalendar,
+ dataIndex: 'calendarId',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ hidden: true,
+ filter: {
+ type: 'list',
+ labelField: 'name',
+ store: 'AllCalendars'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('calendarId')
+ }]
+ }
+});
diff --git a/legacy/web/app/view/permissions/SavedCommands.js b/legacy/web/app/view/permissions/SavedCommands.js
new file mode 100644
index 00000000..b57c07a0
--- /dev/null
+++ b/legacy/web/app/view/permissions/SavedCommands.js
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.SavedCommands', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkSavedCommandsView',
+
+ columns: {
+ items: [{
+ text: Strings.sharedDescription,
+ dataIndex: 'description',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }, {
+ text: Strings.sharedType,
+ dataIndex: 'type',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: {
+ type: 'list',
+ idField: 'type',
+ labelField: 'name',
+ store: 'AllCommandTypes'
+ },
+ renderer: Traccar.AttributeFormatter.getFormatter('commandType')
+ }, {
+ text: Strings.commandSendSms,
+ dataIndex: 'textChannel',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'boolean'
+ }]
+ }
+});
diff --git a/legacy/web/app/view/permissions/Users.js b/legacy/web/app/view/permissions/Users.js
new file mode 100644
index 00000000..66cf5d62
--- /dev/null
+++ b/legacy/web/app/view/permissions/Users.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 Anton Tananaev (anton@traccar.org)
+ * Copyright 2017 Andrey Kunitsyn (andrey@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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Ext.define('Traccar.view.permissions.Users', {
+ extend: 'Traccar.view.permissions.Base',
+ xtype: 'linkUsersView',
+
+ columns: {
+ items: [{
+ text: Strings.sharedName,
+ dataIndex: 'name',
+ flex: 1,
+ minWidth: Traccar.Style.columnWidthNormal,
+ filter: 'string'
+ }]
+ }
+});
diff --git a/legacy/web/apple-touch-icon.png b/legacy/web/apple-touch-icon.png
new file mode 100644
index 00000000..880c4493
--- /dev/null
+++ b/legacy/web/apple-touch-icon.png
Binary files differ
diff --git a/legacy/web/beep.wav b/legacy/web/beep.wav
new file mode 100644
index 00000000..c2364f11
--- /dev/null
+++ b/legacy/web/beep.wav
Binary files differ
diff --git a/legacy/web/debug.html b/legacy/web/debug.html
new file mode 100644
index 00000000..08b6e07d
--- /dev/null
+++ b/legacy/web/debug.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+<title>${title}</title>
+<link rel="icon" sizes="192x192" href="/icon.png">
+<link rel="apple-touch-icon" href="/apple-touch-icon.png">
+<link rel="stylesheet" href="app.css">
+</head>
+<body>
+<div id="spinner"></div>
+<div id="attribution">Powered by <a href="https://www.traccar.org/" target="_blank">Traccar GPS Tracking System</a></div>
+<script id="loadScript" mode="debug" src="load.js"></script>
+</body>
+</html>
diff --git a/legacy/web/favicon.ico b/legacy/web/favicon.ico
new file mode 100644
index 00000000..6be99dda
--- /dev/null
+++ b/legacy/web/favicon.ico
Binary files differ
diff --git a/legacy/web/icon.png b/legacy/web/icon.png
new file mode 100644
index 00000000..afa15c7b
--- /dev/null
+++ b/legacy/web/icon.png
Binary files differ
diff --git a/legacy/web/images/animal.svg b/legacy/web/images/animal.svg
new file mode 100644
index 00000000..a077029b
--- /dev/null
+++ b/legacy/web/images/animal.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m19.525 15.802q0 0.5865-0.17372 1.1144-0.17372 0.51808-0.57602 0.8993t-0.96004 0.38122q-0.69489 0-1.2618-0.55718-0.56688-0.56695-0.84118-1.3294t-0.2743-1.476q0-0.5865 0.17372-1.1046 0.17372-0.52785 0.57602-0.90908 0.4023-0.38122 0.96004-0.38122 0.70403 0 1.2618 0.56695 0.56688 0.55718 0.84118 1.3196 0.2743 0.75268 0.2743 1.476zm-3.127 4.7213q0 0.782-0.38402 1.3587-0.38402 0.57672-1.088 0.57672-0.69489 0-1.2983-0.53763-0.59431-0.5474-0.91432-1.3099-0.32001-0.76245-0.32001-1.4858 0-0.782 0.38402-1.3587 0.38402-0.5865 1.088-0.5865 0.69488 0 1.2892 0.5474 0.60345 0.53763 0.92347 1.3099 0.32001 0.76245 0.32001 1.4858zm3.602-0.264q1.0789 0 2.3315 0.95795 1.2526 0.94818 2.0938 2.3167 0.84118 1.3587 0.84118 2.4829 0 0.44965-0.15544 0.7429-0.15544 0.30302-0.44802 0.43988-0.28344 0.14662-0.58517 0.1955-0.30173 0.05865-0.69489 0.05865-0.62174 0-1.7189-0.43988-1.088-0.44-1.664-0.44-0.60345 0-1.7646 0.4301-1.152 0.43988-1.8286 0.43988-1.6732 0-1.6732-1.4272 0-0.84065 0.51202-1.867 0.51202-1.0362 1.2709-1.8866 0.76803-0.85043 1.7189-1.4272 0.951-0.577 1.765-0.577zm2.1852-2.0625q-0.55774 0-0.96004-0.38122t-0.57602-0.8993q-0.17372-0.52785-0.17372-1.1144 0-0.72335 0.2743-1.476 0.2743-0.76245 0.83204-1.3196 0.56688-0.56695 1.2709-0.56695 0.55774 0 0.96004 0.38122t0.57602 0.90908q0.17372 0.51808 0.17372 1.1046 0 0.71358-0.2743 1.476-0.2743 0.76245-0.84118 1.3294-0.56688 0.55718-1.2618 0.55718zm3.9499-1.0166q0.70403 0 1.088 0.5865 0.38402 0.57673 0.38402 1.3587 0 0.72335-0.32001 1.4858t-0.92347 1.3099q-0.59431 0.53763-1.2892 0.53763-0.70403 0-1.088-0.57672-0.38402-0.57673-0.38402-1.3587 0-0.72335 0.32001-1.4858 0.32001-0.77222 0.91432-1.3099 0.60345-0.5474 1.2983-0.5474z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/arrow.svg b/legacy/web/images/arrow.svg
new file mode 100644
index 00000000..1aed6e03
--- /dev/null
+++ b/legacy/web/images/arrow.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg3369" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="26" viewBox="0 0 26 26" width="26" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <polygon id="arrow" stroke="#000" points="19 22 13 19 7 22 13 4" stroke-width="1px" fill="#008000"/>
+</svg>
diff --git a/legacy/web/images/bicycle.svg b/legacy/web/images/bicycle.svg
new file mode 100644
index 00000000..4eb82eaa
--- /dev/null
+++ b/legacy/web/images/bicycle.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m16.793 22.105h-2.5821q-0.32893 0-0.47695-0.28781-0.1398-0.28782 0.05757-0.55096l1.546-2.064q-0.53451-0.25492-1.1266-0.25492-1.0855 0-1.8585 0.77299-0.77299 0.77299-0.77299 1.8585t0.77299 1.8585q0.77299 0.77299 1.8585 0.77299 0.94568 0 1.6693-0.59208 0.72365-0.6003 0.91278-1.5131zm-1.5295-1.0526h1.5295q-0.14802-0.69898-0.61674-1.217l-0.91278 1.217zm3.9472 0 2.3683-3.1577h-3.9472l-0.8141 1.0855q0.86344 0.847 1.0361 2.0723h1.3568zm8.4371 2.3848q0.77299-0.77299 0.77299-1.8585t-0.77299-1.8585q-0.77299-0.77299-1.8585-0.77299-0.4934 0-0.99502 0.19736l1.4308 2.1381q0.12335 0.18914 0.08224 0.40294-0.04112 0.2138-0.22203 0.32893-0.12335 0.09046-0.29604 0.09046-0.28781 0-0.43583-0.23847l-1.4308-2.1381q-0.76476 0.78121-0.76476 1.8502 0 1.0855 0.77299 1.8585 0.77299 0.77299 1.8585 0.77299t1.8585-0.77299zm0.74009-4.457q1.0855 1.0772 1.0855 2.5986 0 1.5213-1.0855 2.6068-1.0772 1.0772-2.5986 1.0772-1.5213 0-2.6068-1.0772-1.0772-1.0855-1.0772-2.6068 0-0.79766 0.32071-1.5049 0.32893-0.71542 0.90456-1.2335l-0.53451-0.80588-2.9028 3.8567q-0.14802 0.2138-0.41939 0.2138h-1.62q-0.18914 1.3486-1.2253 2.2532-1.0361 0.90456-2.4176 0.90456-1.5213 0-2.6068-1.0772-1.0772-1.0855-1.0772-2.6068t1.0772-2.5986q1.0855-1.0855 2.6068-1.0855 0.93745 0 1.768 0.45228l1.1266-1.5049h-1.842q-0.21381 0-0.37005-0.15624t-0.15624-0.37005q0-0.2138 0.15624-0.37005 0.15624-0.15624 0.37005-0.15624h3.1577v1.0526h3.5771l-0.69898-1.0526h-1.8256q-0.21381 0-0.37005-0.15624t-0.15624-0.37005 0.15624-0.37005 0.37005-0.15624h2.1052q0.27137 0 0.43583 0.23025l2.1956 3.2893q0.74832-0.36182 1.5789-0.36182 1.5213 0 2.5986 1.0855z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/boat.svg b/legacy/web/images/boat.svg
new file mode 100644
index 00000000..f1620ca6
--- /dev/null
+++ b/legacy/web/images/boat.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816-1.1309 3.3906a12.374 12.374 0 0 1 1.1309 -0.0625 12.374 12.374 0 0 1 1.1289 0.056641l-1.129-3.3847zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" stroke-width=".78953" d="m20 11.146c-2.1317 5.5267-6.3162 6.785-6.3162 6.785l6.316 1.9v-8.685zm0 8.6848h-6.711v0.64149c0 0.93043 0.77808 1.7633 1.8011 2.3686-0.36215 0.12387-0.72989 0.14804-1.0116 0.14804-0.55267 0-1.4212-0.15791-1.9738-0.78953v1.5791c0.55267 0.63162 1.4212 0.78953 1.9738 0.78953 0.55267 0 1.4212-0.15791 1.9738-0.78953 0.55267 0.63162 1.4212 0.78953 1.9738 0.78953 0.55267 0 1.4212-0.15791 1.9738-0.78953 0.55267 0.63162 1.4212 0.78953 1.9738 0.78953 0.55267 0 1.4212-0.15791 1.9738-0.78953 0.55267 0.63162 1.4212 0.78953 1.9738 0.78953 0.55267 0 1.4212-0.15791 1.9738-0.78953v-1.5791c-0.55267 0.63162-1.4212 0.78953-1.9738 0.78953-0.39586 0-0.94322-0.09201-1.431-0.37009 1.0794-0.59227 2.1544-1.4653 2.9361-2.788h-2.6893-4.7372zm4.7372 0s0.0099-4.0167-3.3062-7.2538c0.63162 4.3424-0.64149 5.9215-0.64149 5.9215l3.9476 1.3323zm-12.632 4.7372v1.5791c0.55267 0.63162 1.4212 0.78953 1.9738 0.78953 0.55267 0 1.4212-0.1579 1.9738-0.78953 0.55267 0.63162 1.4212 0.78953 1.9738 0.78953 0.55267 0 1.4212-0.1579 1.9738-0.78953 0.55267 0.63162 1.4212 0.78953 1.9738 0.78953 0.55267 0 1.4212-0.1579 1.9738-0.78953 0.55267 0.63162 1.4212 0.78953 1.9738 0.78953 0.55267 0 1.4212-0.1579 1.9738-0.78953v-1.5791c-0.55267 0.63162-1.4212 0.78953-1.9738 0.78953-0.55267 0-1.4212-0.1579-1.9738-0.78953-0.55267 0.63162-1.4212 0.78953-1.9738 0.78953-0.55267 0-1.4212-0.1579-1.9738-0.78953-0.55267 0.63162-1.4212 0.78953-1.9738 0.78953-0.55267 0-1.4212-0.1579-1.9738-0.78953-0.55267 0.63162-1.4212 0.78953-1.9738 0.78953-0.55267 0-1.4212-0.1579-1.9738-0.78953z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/bus.svg b/legacy/web/images/bus.svg
new file mode 100644
index 00000000..2f3b9234
--- /dev/null
+++ b/legacy/web/images/bus.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m16.144 23.756q0.34724-0.34724 0.34724-0.83154t-0.34724-0.8224q-0.3381-0.34724-0.8224-0.34724-0.48431 0-0.83154 0.34724-0.3381 0.3381-0.3381 0.8224 0 0.48431 0.3381 0.83154 0.34724 0.3381 0.83154 0.3381t0.8224-0.3381zm9.3571 0q0.34724-0.34724 0.34724-0.83154t-0.34724-0.8224q-0.3381-0.34724-0.8224-0.34724-0.48431 0-0.83154 0.34724-0.3381 0.3381-0.3381 0.8224 0 0.48431 0.3381 0.83154 0.34724 0.3381 0.83154 0.3381t0.8224-0.3381zm-0.0731-4.4501-0.65793-3.5089q-0.04569-0.21017-0.21017-0.3381-0.15534-0.13707-0.36551-0.13707h-8.3885q-0.21017 0-0.37465 0.13707-0.15534 0.12793-0.20103 0.3381l-0.65792 3.5089q-0.046 0.274 0.128 0.484t0.448 0.21h9.7044q0.27414 0 0.44775-0.21017 0.17362-0.21017 0.12794-0.48431zm-2.193-5.282q0.12794-0.12794 0.12794-0.31069 0-0.18276-0.12794-0.31069-0.12793-0.12794-0.31069-0.12794h-5.8482q-0.18276 0-0.31069 0.12794-0.12793 0.12793-0.12793 0.31069t0.12793 0.31069q0.12794 0.12794 0.31069 0.12794h5.8482q0.18276 0 0.31069-0.12794zm3.7831 6.3142v5.5101h-1.1696v1.1696q0 0.48431-0.34724 0.8224-0.3381 0.34724-0.8224 0.34724-0.48431 0-0.83154-0.34724-0.3381-0.3381-0.3381-0.8224v-1.1696h-7.0179v1.1696q0 0.48431-0.34724 0.8224-0.3381 0.34724-0.8224 0.34724-0.48431 0-0.83154-0.34724-0.3381-0.3381-0.3381-0.8224v-1.1696h-1.1696v-5.5101q0-1.0234 0.22844-2.0377l0.9412-4.1486q0.08224-0.71275 0.88637-1.2519 0.81327-0.53913 2.1017-0.81327 1.2976-0.27414 2.8601-0.27414 1.5626 0 2.851 0.27414 1.2976 0.27413 2.1017 0.81327 0.81327 0.53913 0.89551 1.2519l0.95948 4.1486q0.21017 0.93206 0.21017 2.0377z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/car.svg b/legacy/web/images/car.svg
new file mode 100644
index 00000000..da5b5553
--- /dev/null
+++ b/legacy/web/images/car.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1" stroke="#333">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m15.029 22.296q0.39535-0.39535 0.39535-0.95053t-0.39535-0.95053q-0.396-0.395-0.951-0.395-0.55518 0-0.95053 0.39535t-0.39535 0.95053 0.39535 0.95053 0.95053 0.39535 0.95053-0.39535zm0.69818-3.6423h8.5463l-0.74865-3.003q-0.01682-0.06729-0.11777-0.143-0.10094-0.08412-0.17665-0.08412h-6.4602q-0.07572 0-0.17665 0.08412-0.10095 0.07571-0.11777 0.143l-0.74865 3.003zm11.146 3.6423q0.39535-0.39535 0.39535-0.95053t-0.39535-0.95053q-0.396-0.395-0.951-0.395-0.55518 0-0.95053 0.39535t-0.39535 0.95053 0.39535 0.95053 0.95053 0.39535 0.95053-0.39535zm1.7412-1.7581v3.2301q0 0.11777-0.07571 0.19347-0.07572 0.07571-0.19347 0.07571h-0.80753v1.0767q0 0.67294-0.47106 1.144t-1.144 0.47106-1.144-0.47106-0.47106-1.144v-1.0767h-8.6136v1.0767q0 0.67294-0.47106 1.144t-1.144 0.47106-1.144-0.47106-0.47106-1.144v-1.0767h-0.80753q-0.11777 0-0.19347-0.07571-0.07571-0.07572-0.07571-0.19347v-3.2301q0-0.78229 0.54676-1.3291 0.55518-0.55518 1.3375-0.55518h0.23553l0.88324-3.5245q0.19347-0.7907 0.87482-1.3206 0.68135-0.53835 1.5057-0.53835h6.4602q0.82435 0 1.5057 0.53835 0.68135 0.52994 0.87482 1.3206l0.88323 3.5245h0.23553q0.78229 0 1.3291 0.55518 0.55518 0.54676 0.55518 1.3291z" stroke-width=".1"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/crane.svg b/legacy/web/images/crane.svg
new file mode 100644
index 00000000..6b66b779
--- /dev/null
+++ b/legacy/web/images/crane.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816-1.1309 3.3906a12.374 12.374 0 0 1 1.1309 -0.0625 12.374 12.374 0 0 1 1.1289 0.056641l-1.129-3.3847zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" stroke-width=".75357" d="m24.334 12.464-4.2153 3.0143c0.10399 0.11605 0.20347 0.23888 0.28259 0.37679l0.51808 0.91842 2.0252-1.4601-1.5778 2.2372 0.49453 0.87132c0.14017 0.18613 0.25282 0.39374 0.32969 0.61228l4.5921-6.5702h-2.4491zm2.4491 1.3188-1.5071 2.143v4.074c0 0.41597 0.3376 0.75357 0.75358 0.75357 0.41522 0 0.75357 0.33836 0.75357 0.75358s-0.33836 0.75357-0.75357 0.75357c-0.41522 0-0.75358-0.33835-0.75358-0.75357h-1.5071c0 1.3858 1.2521 2.4766 2.6846 2.2136 0.88771-0.16277 1.6164-0.87999 1.7897-1.7662 0.22909-1.1718-0.45328-2.2074-1.4601-2.5669v-5.6047zm-12.057 1.6955c-0.8327 0-1.5071 0.67445-1.5071 1.5071v3.7679c0 0.41597 0.3376 0.75358 0.75358 0.75358h0.75357v0.75357h5.275v-0.75357h0.75358c0.41597 0 0.75358-0.3376 0.75358-0.75358v-1.5071l-1.8368-3.0143c-0.269-0.468-0.756-0.753-1.296-0.753h-3.6501zm1.5071 1.5071h2.143l1.2952 2.2607h-3.4382v-2.2607zm-2.2607 6.0286c-1.2487 0-2.2607 1.0121-2.2607 2.2607 0 1.2487 1.012 2.2607 2.2607 2.2607h6.7822c1.2487 0 2.2607-1.0121 2.2607-2.2607 0-1.2487-1.0121-2.2607-2.2607-2.2607h-6.7822zm0 1.5071c0.41597 0 0.75357 0.3376 0.75357 0.75357s-0.3376 0.75358-0.75357 0.75358-0.75358-0.3376-0.75358-0.75358c0-0.41597 0.3376-0.75357 0.75358-0.75357zm2.2607 0c0.41597 0 0.75358 0.3376 0.75358 0.75357s-0.3376 0.75358-0.75358 0.75358c-0.41597 0-0.75357-0.3376-0.75357-0.75358 0-0.41597 0.3376-0.75357 0.75357-0.75357zm2.2607 0c0.41597 0 0.75358 0.3376 0.75358 0.75357s-0.3376 0.75358-0.75358 0.75358c-0.41597 0-0.75357-0.3376-0.75357-0.75358 0-0.41597 0.3376-0.75357 0.75357-0.75357zm2.2607 0c0.41597 0 0.75358 0.3376 0.75358 0.75357s-0.3376 0.75358-0.75358 0.75358c-0.41597 0-0.75358-0.3376-0.75358-0.75358 0-0.41597 0.3376-0.75357 0.75358-0.75357z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/default.svg b/legacy/web/images/default.svg
new file mode 100644
index 00000000..f2e9790b
--- /dev/null
+++ b/legacy/web/images/default.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <circle id="icon" cx="20" cy="20" r="5.8251"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/helicopter.svg b/legacy/web/images/helicopter.svg
new file mode 100644
index 00000000..f9c82419
--- /dev/null
+++ b/legacy/web/images/helicopter.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816-1.1309 3.3906a12.374 12.374 0 0 1 1.1309 -0.0625 12.374 12.374 0 0 1 1.1289 0.056641l-1.129-3.3847zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" stroke-width=".88712" d="m14.606 13.91v1.7742h6.2098v0.88712c-2.6614 0-3.5165 1.7281-3.5485 1.7742h-3.5485v0.88712 0.88712l3.5485 0.88712c0 1.3236 1.3378 2.6614 2.6614 2.6614h2.6614c2.6614 0 4.4356-0.76026 4.4356-2.6614 0-1.6225-2.2284-3.988-5.3227-4.3802v-0.94256h6.2098v-1.7742l-6.2098 0.88712v-0.44356c0-0.24485-0.19872-0.44356-0.44356-0.44356s-0.44356 0.19871-0.44356 0.44356v0.44356l-6.2098-0.88712zm-0.88712 5.3227c0-0.97989-0.79436-1.7742-1.7742-1.7742-0.97988 0-1.7742 0.79435-1.7742 1.7742 0 0.97988 0.79436 1.7742 1.7742 1.7742 0.97989 0 1.7742-0.79436 1.7742-1.7742zm7.9841-0.88712c0.2821-0.03992 2.8831 0.79042 3.5485 2.6614h-3.5485v-2.6614zm4.4356 5.3227v0.88712h-8.8712v1.7742h8.8712c0.98027 0 1.7742-0.79397 1.7742-1.7742v-0.88712h-1.7742z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/motorcycle.svg b/legacy/web/images/motorcycle.svg
new file mode 100644
index 00000000..d8d18f1d
--- /dev/null
+++ b/legacy/web/images/motorcycle.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m29.386 21.143q0.09803 0.8414-0.17972 1.6256-0.27774 0.77605-0.80873 1.3315-0.53098 0.55549-1.2989 0.86591-0.75971 0.31042-1.6011 0.25324-1.3152-0.08986-2.2873-1.0211-0.96394-0.93126-1.0946-2.2383-0.09803-0.90675 0.22056-1.7155 0.32676-0.8169 0.9721-1.3969l-0.58-0.87408q-0.78422 0.65352-1.2335 1.5848-0.44929 0.93126-0.44929 1.9932 0 0.22056-0.15521 0.38394-0.14704 0.15521-0.3676 0.15521h-2.0913-0.56366q-0.18789 1.3397-1.2172 2.2383-1.0293 0.89858-2.4017 0.89858-1.5113 0-2.5896-1.0701-1.0701-1.0783-1.0701-2.5896t1.0701-2.5814q1.0783-1.0783 2.5896-1.0783 0.62084 0 1.2417 0.22056l0.19606-0.3676q-1.0048-0.89858-2.4834-0.89858h-0.52281q-0.21239 0-0.3676-0.15521t-0.15521-0.3676 0.15521-0.3676 0.3676-0.15521h1.0456q0.63718 0 1.1845 0.11437 0.54732 0.1062 0.9476 0.31042 0.40845 0.20422 0.58816 0.32676 0.17972 0.11437 0.41662 0.29408h4.1825 0.93943l-0.69436-1.0456h-1.8135q-0.24507 0-0.40028-0.17972-0.15521-0.18789-0.11437-0.43296 0.03267-0.18789 0.18788-0.31042t0.35126-0.12253h2.0667q0.26958 0 0.43296 0.22873l0.57183 0.85774 0.93126-0.93126q0.15521-0.15521 0.37577-0.15521h0.82506q0.21239 0 0.3676 0.15521t0.15521 0.3676v1.0456q0 0.21239-0.15521 0.3676t-0.3676 0.15521h-1.4622l0.93943 1.4051q1.0701-0.51465 2.2465-0.29408 1.1682 0.21239 1.9932 1.1028 0.82506 0.88225 0.96394 2.0667zm-15.137 3.039q0.93943 0 1.6583-0.58816 0.71887-0.59634 0.90675-1.5031h-2.5651q-0.28591 0-0.44929-0.25324-0.14704-0.26141-0.0082-0.51464l1.2008-2.2628q-0.38394-0.1062-0.74338-0.1062-1.0783 0-1.8462 0.76788-0.76788 0.76788-0.76788 1.8462t0.76788 1.8462q0.76788 0.76788 1.8462 0.76788zm9.6557-0.76788q0.76788 0.76788 1.8462 0.76788t1.8462-0.76788q0.76788-0.76788 0.76788-1.8462t-0.76788-1.8462q-0.76788-0.76788-1.8462-0.76788-0.49014 0-0.98844 0.19606l1.4214 2.1239q0.12254 0.18789 0.0817 0.40028-0.04085 0.21239-0.22056 0.32676-0.12253 0.08986-0.29408 0.08986-0.28591 0-0.43296-0.2369l-1.4214-2.1239q-0.75971 0.77605-0.75971 1.838 0 1.0783 0.76788 1.8462z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/offroad.svg b/legacy/web/images/offroad.svg
new file mode 100644
index 00000000..51c9c812
--- /dev/null
+++ b/legacy/web/images/offroad.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816-1.1309 3.3906a12.374 12.374 0 0 1 1.1309 -0.0625 12.374 12.374 0 0 1 1.1289 0.056641l-1.129-3.3847zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" style="block-progression:tb;text-transform:none;text-indent:0" stroke-width=".80151" overflow="visible" d="m12.987 13.989c-0.51858 0-0.78749 0.10941-1.052 0.55104-0.2645 0.44164-1.5529 4.3925-1.5529 5.0345v2.7803c0 0.65003 0.60274 1.2524 1.2023 1.2524h0.40076c0 1.3281 1.0764 2.4045 2.4045 2.4045s2.4045-1.0764 2.4045-2.4045h7.2136c0 1.3281 1.0764 2.4045 2.4045 2.4045s2.4045-1.0764 2.4045-2.4045c0-0.07005-0.01918-0.13186-0.02505-0.20038 0.37553-0.28539 0.82656-0.80321 0.82656-1.052v-2.2292c0-0.86884-1.5457-1.1858-4.258-1.8535 0 0-2.4963-2.9345-3.156-3.732-0.42881-0.51858-0.98827-0.55104-1.4026-0.55104h-7.8148zm2.655 1.2774h1.9537v3.5317h-2.8303c-0.36549 0-0.64622-0.1066-0.52599-0.70132 0.12504-0.62037 0.51638-2.1555 0.62618-2.4296 0.12504-0.31099 0.38132-0.40076 0.77647-0.40076zm3.5567 0h1.7283c0.30858 0 0.65684 0.09879 0.85161 0.32562l2.2793 2.7051c0.25408 0.33664 0.14287 0.50095-0.17533 0.50095h-4.6838v-3.5317zm-4.8091 7.1385c0.66285 0 1.2023 0.53942 1.2023 1.2023 0 0.66285-0.53942 1.2023-1.2023 1.2023-0.66285 0-1.2023-0.53942-1.2023-1.2023 0-0.66285 0.53942-1.2023 1.2023-1.2023zm12.023 0c0.66285 0 1.2023 0.53942 1.2023 1.2023 0 0.66285-0.53942 1.2023-1.2023 1.2023-0.66285 0-1.2023-0.53942-1.2023-1.2023 0-0.66285 0.53942-1.2023 1.2023-1.2023z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/person.svg b/legacy/web/images/person.svg
new file mode 100644
index 00000000..124bbaf7
--- /dev/null
+++ b/legacy/web/images/person.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m26.287 24.941q0 1.0708-0.6189 1.837-0.60907 0.76625-1.4736 0.76625h-8.3895q-0.86449 0-1.4834-0.76625-0.60907-0.76625-0.60907-1.837 0-0.83502 0.07859-1.5718 0.08841-0.7466 0.31436-1.4932 0.22595-0.75643 0.56978-1.2869 0.35366-0.54031 0.92343-0.87432 0.5796-0.34383 1.3262-0.34383 1.2869 1.2574 3.0748 1.2574t3.0748-1.2574q0.7466 0 1.3164 0.34383 0.5796 0.33401 0.92343 0.87432 0.35366 0.53048 0.5796 1.2869 0.22595 0.7466 0.30454 1.4932 0.08842 0.73678 0.08842 1.5718zm-3.625-11.376q1.1101 1.1003 1.1101 2.6622 0 1.562-1.1101 2.6721-1.1 1.101-2.662 1.101t-2.6721-1.1003q-1.1003-1.1101-1.1003-2.6721t1.1003-2.6622q1.11-1.11 2.672-1.11t2.6622 1.1101z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/pickup.svg b/legacy/web/images/pickup.svg
new file mode 100644
index 00000000..50bf57be
--- /dev/null
+++ b/legacy/web/images/pickup.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816-1.1309 3.3906a12.374 12.374 0 0 1 1.1309 -0.0625 12.374 12.374 0 0 1 1.1289 0.056641l-1.129-3.3847zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" stroke-width=".88152" d="m17.19 14.711a0.8816 0.8816 0 0 0 -0.68868 0.66114l-0.71623 2.8649h-3.2781c-0.96967 0-1.763 0.79336-1.763 1.763v2.1211c0 0.35261 0.17079 0.62257 0.5234 0.79887l1.2672 0.4683c0.14704 1.0824 1.0477 1.9008 2.1762 1.9008 1.0799 0 1.9462-0.75066 2.1487-1.763h7.1623c0.20247 1.0124 1.0688 1.763 2.1487 1.763 1.157 0 2.0652-0.85999 2.1762-1.9834l0.4683-0.30302c0.26446-0.1763 0.44076-0.52891 0.44076-0.88152v-1.5151c0-0.35261-0.25344-0.68318-0.60604-0.77133l-3.9668-1.3498-2.1762-2.7272-0.0551-0.08264-0.02755 0.02755c-0.44623-0.66103-1.2059-0.99171-1.9008-0.99171h-3.1679a0.8816 0.8816 0 0 0 -0.08265 0 0.8816 0.8816 0 0 0 -0.08264 0zm0.85397 1.763h2.4793c0.33302 0 0.40036 0.03368 0.49585 0.19283a0.8816 0.8816 0 0 0 0.0551 0.08264l1.1845 1.4876h-4.6555l0.44076-1.763zm-3.3332 5.8125c0.44076 0 0.79887 0.35812 0.79887 0.79887 0 0.44076-0.35812 0.79887-0.79887 0.79887-0.44076 0-0.79887-0.35812-0.79887-0.79887 0-0.44076 0.35812-0.79887 0.79887-0.79887zm11.46 0c0.44076 0 0.79887 0.35812 0.79887 0.79887 0 0.44076-0.35812 0.79887-0.79887 0.79887-0.44076 0-0.79887-0.35812-0.79887-0.79887 0-0.44076 0.35812-0.79887 0.79887-0.79887z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/plane.svg b/legacy/web/images/plane.svg
new file mode 100644
index 00000000..a46eb748
--- /dev/null
+++ b/legacy/web/images/plane.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m26.238 13.763q0.4325 0.51114 0.11796 1.4548-0.31455 0.94364-1.0616 1.6907l-1.5826 1.5826 1.5727 6.8414q0.04915 0.18676-0.11796 0.32438l-1.2582 0.94364q-0.06881 0.05897-0.18676 0.05897-0.03931 0-0.06881-0.0099-0.14744-0.0295-0.20642-0.15727l-2.7425-4.9934-2.5459 2.5459 0.52097 1.9069q0.04915 0.1671-0.07864 0.30472l-0.94364 0.94364q-0.08847 0.08847-0.22608 0.08847h-0.01966q-0.14744-0.01966-0.23591-0.12778l-1.8578-2.477-2.4771-1.8578q-0.10813-0.06881-0.12778-0.22608-0.0099-0.12778 0.08847-0.24574l0.94364-0.95343q0.08847-0.08847 0.22608-0.08847 0.05898 0 0.07864 0.0099l1.9069 0.52097 2.5459-2.5459-4.9934-2.7425q-0.13762-0.07863-0.1671-0.23591-0.01966-0.15728 0.08847-0.2654l1.2582-1.2582q0.13762-0.12778 0.29489-0.07864l6.5367 1.5629 1.5727-1.5727q0.74705-0.74705 1.6907-1.0616 0.94364-0.31455 1.4548 0.11796z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/scooter.svg b/legacy/web/images/scooter.svg
new file mode 100644
index 00000000..c7b531cb
--- /dev/null
+++ b/legacy/web/images/scooter.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" style="text-decoration-color:#000000;block-progression:tb;isolation:auto;mix-blend-mode:normal;text-indent:0;text-decoration-line:none;white-space:normal;text-transform:none;text-decoration-style:solid" stroke-width=".60887" d="m20.609 12.298a0.60893 0.60893 0 1 0 0 1.2177h1.3795l2.0228 6.443-2.5163 3.9077h-5.871c-0.25412-0.70466-0.92507-1.2177-1.7124-1.2177-1.0016 0-1.8266 0.82501-1.8266 1.8266s0.82501 1.8266 1.8266 1.8266c0.78736 0 1.4583-0.51307 1.7124-1.2177h6.2028a0.60893 0.60893 0 0 0 0.51135 -0.27946l2.1477-3.3345 0.49232 1.5697c-0.43114 0.33547-0.71589 0.85238-0.71589 1.4354 0 1.0016 0.82501 1.8266 1.8266 1.8266s1.8266-0.82501 1.8266-1.8266c0-0.98654-0.80143-1.7976-1.7826-1.8218l-3.1157-9.9286a0.60893 0.60893 0 0 0 -0.58151 -0.42692h-1.8266zm-6.6975 11.568c0.33112 0 0.58355 0.24891 0.60173 0.57438a0.60893 0.60893 0 0 0 0 0.07017c-0.01874 0.32487-0.27102 0.57319-0.60173 0.57319-0.34348 0-0.60887-0.26539-0.60887-0.60887s0.26539-0.60887 0.60887-0.60887zm12.177 0c0.34348 0 0.60887 0.26539 0.60887 0.60886 0 0.34348-0.26539 0.60887-0.60887 0.60887s-0.60886-0.26539-0.60886-0.60887 0.26539-0.60886 0.60886-0.60886z" white-space="normal" overflow="visible" font-weight="400"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/ship.svg b/legacy/web/images/ship.svg
new file mode 100644
index 00000000..f94a6bbe
--- /dev/null
+++ b/legacy/web/images/ship.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m26.094 25.102q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.99107 0.99107-0.69685 0.69685-0.64265-0.64265-0.64265 0.64265q-0.13937 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.99107-0.99107 0.69685-0.69685 0.64265 0.64265 0.64265-0.64265q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.64265 0.64265 0.64265-0.64265q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.64265 0.64265 0.64265-0.64265q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.64265 0.64265 0.64265-0.64265q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.64265 0.64265 0.64265-0.64265q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.64265 0.64265 0.64265-0.64265q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.64265 0.64265 0.64265-0.64265zm-12.188-0.294q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.99107-0.99107 0.69685-0.69685 0.64265 0.6349 0.64265-0.6349q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.64265 0.6349 0.49554-0.49554v-2.2686l-1.626-2.4312q-0.13163-0.20131-0.0542-0.43359 0.07743-0.24003 0.30971-0.31745l1.3705-0.44908v-2.3151h0.99107v-0.99107h1.9821v-0.99107h1.9821v0.99107h1.9821v0.99107h0.99107v2.3151l1.3705 0.44908q0.23228 0.07742 0.30971 0.31745 0.07743 0.23228-0.0542 0.43359l-1.626 2.4312v2.2686l0.14711-0.13937q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.64265 0.6349 0.64265-0.6349q0.14711-0.14711 0.34842-0.14711t0.34842 0.14711l0.99107 0.99107-0.69685 0.69685-0.64265-0.64265-0.64265 0.64265q-0.13937 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64264-0.64265-0.64265 0.64265q-0.14711 0.14711-0.34842 0.14711t-0.34842-0.14711l-0.64265-0.64265-0.64265 0.64265zm3.1203-8.7725v0.99107l2.974-0.991 2.9732 0.99107v-0.99107h-0.99107v-0.99107h-3.9643v0.99107h-0.99107z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/tractor.svg b/legacy/web/images/tractor.svg
new file mode 100644
index 00000000..96643ef9
--- /dev/null
+++ b/legacy/web/images/tractor.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816-1.1309 3.3906a12.374 12.374 0 0 1 1.1309 -0.0625 12.374 12.374 0 0 1 1.1289 0.056641l-1.129-3.3847zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" stroke-width=".84153" d="m13.105 12.427a0.84162 0.84162 0 0 0 -0.68375 0.84153v5.0492a0.84162 0.84162 0 0 0 0 0.07889v1.8672c0.84153-0.67323 1.8514-1.1045 2.9454-1.1045 2.5246 0 4.6284 2.1038 4.6284 4.6284v0.42077h3.7869c-0.25895 0.34961-0.42077 0.78515-0.42077 1.2623 0 1.1781 0.92569 2.1038 2.1038 2.1038s2.1038-0.92569 2.1038-2.1038c0-0.55373-0.21318-1.0478-0.55226-1.4201 0.49718-0.2262 0.85521-0.67323 0.97302-1.2623l0.42077-2.7087c0.08415-0.42077-0.33661-0.92043-0.84153-0.92043l-7.1267-0.78894-1.3149-5.3122a0.84162 0.84162 0 0 0 -0.81524 -0.63115h-5.0492a0.84162 0.84162 0 0 0 -0.07889 0 0.84162 0.84162 0 0 0 -0.07889 0zm0.99932 1.6831h3.5502l1.0256 4.0499-4.5758-0.49966v-3.5502zm10.098 0v3.6291l1.6831 0.23668v-3.8658h-1.6831zm-8.8361 5.8907c-2.1038 0-3.7869 1.6831-3.7869 3.7869s1.6831 3.7869 3.7869 3.7869 3.7869-1.6831 3.7869-3.7869-1.6831-3.7869-3.7869-3.7869zm0 1.2623c1.4306 0 2.5246 1.094 2.5246 2.5246s-1.094 2.5246-2.5246 2.5246-2.5246-1.094-2.5246-2.5246 1.094-2.5246 2.5246-2.5246zm10.098 3.3661c0.50492 0 0.84154 0.33661 0.84154 0.84154 0 0.50492-0.33661 0.84153-0.84154 0.84153-0.50492 0-0.84153-0.33661-0.84153-0.84153s0.33661-0.84154 0.84153-0.84154z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/train.svg b/legacy/web/images/train.svg
new file mode 100644
index 00000000..e4b10ace
--- /dev/null
+++ b/legacy/web/images/train.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m18.127 11.484c-0.59864 0-1.0869 0.44565-1.1707 1.0217h-0.362c-1.3143 0-2.3839 1.027-2.3839 2.2881v9.7272c0 0.878 0.51749 1.6389 1.2771 2.0221l-1.6389 1.3622c-0.14633 0.12106-0.16895 0.3379-0.04789 0.48423s0.3379 0.16895 0.48423 0.04789l1.9688-1.6496c0.11175 0.01596 0.22482 0.02128 0.34056 0.02128h6.8111c0.11574 0 0.22881-0.0054 0.34056-0.02128l1.9688 1.6496c0.14633 0.12106 0.36317 0.09844 0.48423-0.04789s0.09844-0.36317-0.04789-0.48423l-1.6389-1.3622c0.7596-0.38313 1.2771-1.1441 1.2771-2.0221v-9.727c0-1.2611-1.0696-2.2881-2.3839-2.2881h-0.36183c-0.08381-0.57602-0.57203-1.0217-1.1707-1.0217-0.59864 0-1.0869 0.44565-1.1707 1.0217h-1.4048c-0.08381-0.57602-0.57203-1.0217-1.1707-1.0217zm0 0.68111c0.28202 0 0.51084 0.22881 0.51084 0.51084 0 0.28202-0.22881 0.51084-0.51084 0.51084-0.28202 0-0.51084-0.22881-0.51084-0.51084 0-0.28202 0.22881-0.51084 0.51084-0.51084zm3.7461 0c0.28202 0 0.51084 0.22881 0.51084 0.51084 0 0.28202-0.22881 0.51084-0.51084 0.51084-0.28202 0-0.51084-0.22881-0.51084-0.51084 0-0.28202 0.22881-0.51084 0.51084-0.51084zm-3.9164 2.7245h4.0867c0.1889 0 0.34056 0.15298 0.34056 0.34056v0.68111h-4.7678v-0.68111c0-0.18757 0.15298-0.34056 0.34056-0.34056zm-1.3622 1.7028h6.8111c0.37648 0 0.68111 0.28336 0.68111 0.6279v2.4903c0 0.34455-0.30464 0.6279-0.68111 0.6279h-6.8111c-0.37648 0-0.68111-0.28335-0.68111-0.6279v-2.4903c0-0.34455 0.30464-0.6279 0.68111-0.6279zm0.34056 6.13c0.56405 0 1.0217 0.45762 1.0217 1.0217 0 0.56405-0.45762 1.0217-1.0217 1.0217-0.56405 0-1.0217-0.45762-1.0217-1.0217 0-0.56405 0.45762-1.0217 1.0217-1.0217zm6.13 0c0.56405 0 1.0217 0.45762 1.0217 1.0217 0 0.56405-0.45762 1.0217-1.0217 1.0217-0.56405 0-1.0217-0.45762-1.0217-1.0217 0-0.56405 0.45762-1.0217 1.0217-1.0217z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/tram.svg b/legacy/web/images/tram.svg
new file mode 100644
index 00000000..70a03078
--- /dev/null
+++ b/legacy/web/images/tram.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m20 11.299c-2.5762 0-3.8283 0.45542-3.8283 1.3921 0 0.19168 0.15634 0.34802 0.34802 0.34802s0.34802-0.15634 0.34802-0.34802c0-0.17129 0.34666-0.45134 1.4247-0.59817l0.294 1.719c-2.8141 0.3154-4.5026 1.5512-4.5026 2.7081v8.1024c0 1.0726 0.7545 1.978 1.7836 2.2513l-1.4574 1.2181c-0.14546 0.12235-0.16586 0.33307-0.0435 0.47853 0.06797 0.08157 0.16314 0.13051 0.26102 0.13051 0.07749 0 0.16314-0.03264 0.22839-0.087l1.9794-1.6531h6.3297l1.9794 1.6531c0.06525 0.05438 0.1509 0.087 0.22839 0.087 0.09788 0 0.19304-0.04894 0.26102-0.13051 0.12235-0.14546 0.10196-0.35618-0.0435-0.47853l-1.4574-1.2181c1.0291-0.27325 1.7836-1.1787 1.7836-2.2513v-8.1024c0-1.1569-1.6885-2.3927-4.5026-2.7081l0.29364-1.7184c1.0781 0.14682 1.4247 0.42687 1.4247 0.59817 0 0.19168 0.15498 0.34802 0.34802 0.34802s0.34802-0.15634 0.34802-0.34802c0-0.93667-1.2521-1.3921-3.8283-1.3921zm0 0.69605c0.37793 0 0.70285 0.01359 1.0006 0.03264l-0.29365 1.7292c-0.23111-0.01223-0.46358-0.02175-0.70692-0.02175-0.24335 0-0.47581 0.0095-0.70692 0.02175l-0.294-1.729c0.29772-0.01903 0.62264-0.03264 1.0006-0.03264zm-2.0881 3.8283h4.1763c0.19304 0 0.34802 0.15634 0.34802 0.34802v0.69605h-4.8723v-0.69605c0-0.19168 0.15634-0.34802 0.34803-0.34802zm-1.3921 1.7401h6.9605c0.38473 0 0.69605 0.28957 0.69605 0.64167v2.5449c0 0.3521-0.31132 0.64167-0.69605 0.64167h-6.9605c-0.38473 0-0.69605-0.28957-0.69605-0.64167v-2.5449c0-0.3521 0.31132-0.64167 0.69605-0.64167zm0.34802 5.5684c0.57641 0 1.0441 0.46766 1.0441 1.0441 0 0.57642-0.46766 1.0441-1.0441 1.0441-0.57642 0-1.0441-0.46766-1.0441-1.0441 0-0.57642 0.46766-1.0441 1.0441-1.0441zm6.2644 0c0.57641 0 1.0441 0.46766 1.0441 1.0441 0 0.57642-0.46766 1.0441-1.0441 1.0441-0.57642 0-1.0441-0.46766-1.0441-1.0441 0-0.57642 0.46766-1.0441 1.0441-1.0441z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/trolleybus.svg b/legacy/web/images/trolleybus.svg
new file mode 100644
index 00000000..344ae8db
--- /dev/null
+++ b/legacy/web/images/trolleybus.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m16.909 11.561c-0.10947 0.01846-0.20311 0.091-0.24927 0.19256-0.04615 0.10024-0.03956 0.21894 0.01715 0.31389l0.70692 1.1817h-1.7726c-1.3031 0-2.3634 1.0604-2.3634 2.3634v10.467c0 0.29807 0.13189 0.56316 0.33763 0.74912v0.60141c0 0.55788 0.45501 1.0129 1.0129 1.0129h1.3505c0.55789 0 1.0129-0.45502 1.0129-1.0129v-0.33763h6.0774v0.33763c0 0.55788 0.45501 1.0129 1.0129 1.0129h1.3505c0.55789 0 1.0129-0.45502 1.0129-1.0129v-0.601c0.204-0.186 0.336-0.451 0.336-0.749v-10.467c0-1.3031-1.0604-2.3634-2.3634-2.3634h-1.7726l0.70692-1.1817c0.06594-0.1121 0.062-0.25191-0.0092-0.35874-0.07254-0.10815-0.20047-0.16618-0.3284-0.14771-0.09892 0.01846-0.18332 0.08045-0.23212 0.16882l-0.90739 1.5193h-3.693l-0.908-1.518c-0.06726-0.12002-0.20179-0.18596-0.33763-0.16882zm-0.96014 3.3763h8.1032c0.57371 0 1.0129 0.43919 1.0129 1.0129v4.7269c0 0.57371-0.43919 1.0129-1.0129 1.0129h-8.1032c-0.57371 0-1.0129-0.43919-1.0129-1.0129v-4.7269c0-0.57371 0.43919-1.0129 1.0129-1.0129zm-3.0387 2.0258c-0.39171 0-0.67527 0.28356-0.67527 0.67526v2.0258c0 0.39171 0.28356 0.67527 0.67527 0.67527zm14.181 0v3.3763c0.39171 0 0.67527-0.28356 0.67527-0.67527v-2.0258c0-0.39171-0.28356-0.67526-0.67527-0.67526zm-11.142 6.415c0.5592 0 1.0129 0.4537 1.0129 1.0129s-0.4537 1.0129-1.0129 1.0129c-0.55921 0-1.0129-0.45369-1.0129-1.0129 0-0.5592 0.45369-1.0129 1.0129-1.0129zm8.1032 0c0.5592 0 1.0129 0.4537 1.0129 1.0129s-0.4537 1.0129-1.0129 1.0129c-0.55921 0-1.0129-0.45369-1.0129-1.0129 0-0.5592 0.45369-1.0129 1.0129-1.0129z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/truck.svg b/legacy/web/images/truck.svg
new file mode 100644
index 00000000..708744d2
--- /dev/null
+++ b/legacy/web/images/truck.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816l-1.131 3.3907a12.374 12.374 0 0 1 1.131 -0.0625 12.374 12.374 0 0 1 1.129 0.0566l-1.129-3.3848zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" d="m17.031 24.899q0.34603-0.34603 0.34603-0.81955t-0.34603-0.81955-0.81955-0.34603-0.81955 0.34603-0.34603 0.81955 0.34603 0.81955 0.81955 0.34603 0.81955-0.34603zm-3.1507-5.4819h3.4968v-2.3312h-1.4388q-0.11838 0-0.20034 0.08196l-1.7757 1.7757q-0.08196 0.08196-0.08196 0.20033v0.27318zm11.31 5.4819q0.34603-0.34603 0.34603-0.81955t-0.34603-0.81955-0.81955-0.34603-0.81955 0.34603-0.34603 0.81955 0.34603 0.81955 0.81955 0.34603 0.81955-0.34603zm2.6772-10.727v9.3247q0 0.13659-0.03642 0.24587-0.03642 0.10017-0.12749 0.16391-0.08196 0.06375-0.1457 0.10927-0.06374 0.03642-0.21855 0.05463-0.1457 0.0091-0.20034 0.01821-0.05463 0-0.23676 0-0.17302-0.0091-0.20034-0.0091 0 0.96525-0.68296 1.6482-0.68296 0.68296-1.6482 0.68296-0.96525 0-1.6482-0.68296-0.68296-0.68292-0.68296-1.6482h-3.4968q0 0.96525-0.68296 1.6482-0.68296 0.68296-1.6482 0.68296-0.96525 0-1.6482-0.68296-0.68296-0.68296-0.68296-1.6482h-0.58279q-0.02732 0-0.20944 0.0091-0.17302 0-0.22765 0-0.05463-0.0091-0.20944-0.01821-0.1457-0.01821-0.20944-0.05463-0.06375-0.04553-0.1548-0.10927-0.08196-0.06375-0.11838-0.16391-0.03642-0.10927-0.03642-0.24586 0-0.23676 0.17302-0.40978t0.40978-0.17302v-2.914q0-0.07285-0.0091-0.31871 0-0.24587 0-0.34603 0.0091-0.10017 0.02732-0.30961 0.01821-0.21855 0.05463-0.33693 0.04554-0.12749 0.12749-0.28229 0.09106-0.1548 0.20944-0.27318l1.803-1.803q0.17302-0.17302 0.45531-0.2914 0.2914-0.11838 0.53726-0.11838h1.457v-1.7484q0-0.23676 0.17302-0.40978t0.40978-0.17302h9.3247q0.23676 0 0.40978 0.17302t0.17302 0.40978z"/>
+ </g>
+</svg>
diff --git a/legacy/web/images/van.svg b/legacy/web/images/van.svg
new file mode 100644
index 00000000..3394b88f
--- /dev/null
+++ b/legacy/web/images/van.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg4145" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="40" width="40" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40">
+ <g id="layer1">
+ <path id="background" d="m20.002 3.6816-1.1309 3.3906a12.374 12.374 0 0 1 1.1309 -0.0625 12.374 12.374 0 0 1 1.1289 0.056641l-1.129-3.3847zm-0.002 3.9434a12.374 12.374 0 0 0 -12.375 12.375 12.374 12.374 0 0 0 12.375 12.375 12.374 12.374 0 0 0 12.375 -12.375 12.374 12.374 0 0 0 -12.375 -12.375z" stroke="#333" stroke-width="1.9" fill="#008000"/>
+ <path id="icon" stroke-width="0.87" d="m12.17 13.91c-0.48024 0-0.87 0.38976-0.87 0.87v3.48 4.35c0 0.96135 0.77865 1.74 1.74 1.74h0.05438c0.20276 0.99123 1.0693 1.74 2.1206 1.74s1.9179-0.74877 2.1206-1.74h5.3287c0.20277 0.99123 1.0693 1.74 2.1206 1.74s1.9179-0.74877 2.1206-1.74h0.05438c0.96135 0 1.74-0.77865 1.74-1.74v-3.2081-0.27188s-1.1719-3.5328-3.2625-5.0841c-0.13137-0.09831-0.29863-0.13594-0.46219-0.13594h-12.805zm10.44 1.74h2.0119c0.74211 0.65859 1.3787 1.7078 1.8216 2.61h-3.8334v-2.61zm-7.395 7.395c0.47937 0 0.87 0.39063 0.87 0.87s-0.39063 0.87-0.87 0.87-0.87-0.39063-0.87-0.87 0.39063-0.87 0.87-0.87zm9.57 0c0.47937 0 0.87 0.39063 0.87 0.87s-0.39063 0.87-0.87 0.87-0.87-0.39063-0.87-0.87 0.39063-0.87 0.87-0.87z"/>
+ </g>
+</svg>
diff --git a/legacy/web/l10n/af.json b/legacy/web/l10n/af.json
new file mode 100644
index 00000000..5ecd845e
--- /dev/null
+++ b/legacy/web/l10n/af.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Laai tans...",
+ "sharedHide": "Verberg",
+ "sharedSave": "Stoor",
+ "sharedUpload": "Upload",
+ "sharedSet": "Stel",
+ "sharedCancel": "Kanselleer",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Sit by",
+ "sharedEdit": "Redigeer",
+ "sharedRemove": "Verwyder",
+ "sharedRemoveConfirm": "Verwyder item",
+ "sharedNoData": "Geen data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Ja",
+ "sharedNo": "Nee",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Uur",
+ "sharedMinute": "Minuut",
+ "sharedSecond": "Sekonde",
+ "sharedDays": "dae",
+ "sharedHours": "ure",
+ "sharedMinutes": "minute",
+ "sharedDecimalDegrees": "Desimale grade",
+ "sharedDegreesDecimalMinutes": "Grade Desimale minute",
+ "sharedDegreesMinutesSeconds": "Grade minute sekondes",
+ "sharedName": "Naam",
+ "sharedDescription": "Beskrywing",
+ "sharedSearch": "Soek",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geografiese omheining",
+ "sharedGeofences": "Geografiese omheinings",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Kennisgewings",
+ "sharedNotification": "Kennisgewing",
+ "sharedAttributes": "Attribute",
+ "sharedAttribute": "Attribuut",
+ "sharedDrivers": "Bestuurders",
+ "sharedDriver": "Bestuurder",
+ "sharedArea": "Gebied",
+ "sharedSound": "Kennisgewing klank",
+ "sharedType": "Tiepe",
+ "sharedDistance": "Afstand",
+ "sharedHourAbbreviation": "u",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "I",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "V.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Kry Kaartstaat",
+ "sharedComputedAttribute": "Berekende attribuut",
+ "sharedComputedAttributes": "Berekende attribute",
+ "sharedCheckComputedAttribute": "Kontroleer Berekende attribuut",
+ "sharedExpression": "Uitdrukking",
+ "sharedDevice": "Toestel",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Stuur Toets Kennisgewing",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Kalender",
+ "sharedCalendars": "Kalenders",
+ "sharedFile": "Lêer",
+ "sharedSearchDevices": "Soek Toestelle",
+ "sharedSortBy": "Sorteer Volgens",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Selekteer Lêer",
+ "sharedPhone": "Foon",
+ "sharedRequired": "Word Vereis",
+ "sharedPreferences": "Voorkeure",
+ "sharedPermissions": "Toelaatbaarhede",
+ "sharedConnections": "Verbindings",
+ "sharedExtra": "Ekstra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Nommer",
+ "sharedTypeBoolean": "Boole",
+ "sharedTimezone": "Tydsone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Gestoorde Bevel",
+ "sharedSavedCommands": "Gestoorde Bevele",
+ "sharedNew": "Nuut...",
+ "sharedShowAddress": "Wys Adres",
+ "sharedShowDetails": "Addisionele besonderhede",
+ "sharedDisabled": "Buite aksie gestel",
+ "sharedMaintenance": "Onderhoud",
+ "sharedDeviceAccumulators": "Akkumulators ",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Kolomme",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Spoedgrens",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polielynafstand",
+ "attributeReportIgnoreOdometer": "Verslag: Ignoreer Odometer",
+ "attributeWebReportColor": "Web: Rapporteer kleur",
+ "attributeDevicePassword": "Toestelwagwoord",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Verwerking: Kopieër attribute",
+ "attributeColor": "Kleur",
+ "attributeWebLiveRouteLength": "Web: Regstreekse Roete Lengte",
+ "attributeWebSelectZoom": "Web: Zoom op Kies",
+ "attributeWebMaxZoom": "Web: Maksimum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Pos: SMTP-gasheer",
+ "attributeMailSmtpPort": "Pos: SMTP-poort",
+ "attributeMailSmtpStarttlsEnable": "Pos: SMTP STARTTLS Aktiveer",
+ "attributeMailSmtpStarttlsRequired": "Pos: SMTP STARTTLS word vereis",
+ "attributeMailSmtpSslEnable": "Pos: SMTP SSL Aktiveer",
+ "attributeMailSmtpSslTrust": "Pos: SMTP SSL Vertrou",
+ "attributeMailSmtpSslProtocols": "Pos: SMTP SSL-protokolle",
+ "attributeMailSmtpFrom": "Pos: SMTP vanaf",
+ "attributeMailSmtpAuth": "Pos: SMTP Auth Aktiveer",
+ "attributeMailSmtpUsername": "Pos: SMTP-gebruikersnaam",
+ "attributeMailSmtpPassword": "Pos: SMTP wagwoord",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: deaktiveer gebeure",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: deaktiveer bestuurders",
+ "attributeUiDisableComputedAttributes": "UI: deaktiveer berekende attribute",
+ "attributeUiDisableCalendars": "UI: deaktiveer kalenders",
+ "attributeUiDisableMaintenance": "UI: deaktiveer onderhoud",
+ "attributeUiHidePositionAttributes": "UI: Verberg posisie attribute",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Fout",
+ "errorGeneral": "Ongeldige parameters of beperking oortreding",
+ "errorConnection": "Verbindings fout",
+ "errorSocket": "Web aansluiting verbinding fout",
+ "errorZero": "Kan nie nul wees nie",
+ "userEmail": "E-pos",
+ "userPassword": "Wagwoord",
+ "userAdmin": "Admin",
+ "userRemember": "Onthou",
+ "userExpirationTime": "Verval",
+ "userDeviceLimit": "Toestel Limiet",
+ "userUserLimit": "Gebruiker Limiet",
+ "userDeviceReadonly": "Toestel Leesalleen",
+ "userLimitCommands": "Beperk Bevele",
+ "userDisableReports": "Deaktiveer Verslae",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Teken aan",
+ "loginLanguage": "Taal",
+ "loginReset": "Herstel Wagwoord",
+ "loginRegister": "Registreer",
+ "loginLogin": "Teken aan",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Verkeerde e-posadres of wagwoord",
+ "loginCreated": "Nuwe gebruiker is geregistreer",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "Nuwe wagwoord is ingestel",
+ "loginLogout": "Teken uit",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Toestelle en staat",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Toestelle",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifiseerder",
+ "deviceModel": "Model",
+ "deviceContact": "Kontak",
+ "deviceCategory": "Kategorie",
+ "deviceLastUpdate": "Laaste Opdatering",
+ "deviceCommand": "Bevel",
+ "deviceFollow": "Volg",
+ "deviceTotalDistance": "Totale Afstand",
+ "deviceStatus": "Toestand",
+ "deviceStatusOnline": "Aanlyn",
+ "deviceStatusOffline": "Van lyn af",
+ "deviceStatusUnknown": "Onbekend",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Groep",
+ "groupParent": "Groep",
+ "groupNoGroup": "Geen Groep",
+ "settingsTitle": "Instellings",
+ "settingsUser": "Rekening",
+ "settingsGroups": "Groepe",
+ "settingsServer": "Bediener",
+ "settingsUsers": "Gebruikers",
+ "settingsDistanceUnit": "Afstand Eenheid",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Spoed Eenheid",
+ "settingsVolumeUnit": "Volume Eenheid",
+ "settingsTwelveHourFormat": "12-uur Formaat",
+ "settingsCoordinateFormat": "Koördinate Formaat",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Verslae",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Toestel",
+ "reportGroup": "Groep",
+ "reportFrom": "Van",
+ "reportTo": "Na",
+ "reportShow": "Wys",
+ "reportClear": "Maak skoon",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Toestel Tyd",
+ "positionServerTime": "Server Time",
+ "positionValid": "Geldig",
+ "positionAccuracy": "Akkuraatheid",
+ "positionLatitude": "Breedtegraad",
+ "positionLongitude": "Lengtegraad",
+ "positionAltitude": "Hoogte",
+ "positionSpeed": "Spoed",
+ "positionCourse": "Koers",
+ "positionAddress": "Adres",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Afstand",
+ "positionRpm": "RPM",
+ "positionFuel": "Brandstof",
+ "positionPower": "Krag",
+ "positionBattery": "Battery",
+ "positionRaw": "Rou",
+ "positionIndex": "Indeks",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelliete",
+ "positionSatVisible": "Sigbare Satelliete",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Wandel",
+ "positionEvent": "Gebeurtenis",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Diens Odometer",
+ "positionTripOdometer": "Reis Odometer",
+ "positionHours": "Ure",
+ "positionSteps": "Stappe",
+ "positionInput": "Inset",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Uitset",
+ "positionBatteryLevel": "Batteryvlak",
+ "positionFuelConsumption": "Brandstofverbruik",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware-weergawe",
+ "positionVersionHw": "Hardeware weergawe",
+ "positionIgnition": "Ontsteking",
+ "positionFlags": "Vlae",
+ "positionCharge": "Herlaai",
+ "positionIp": "IP",
+ "positionArchive": "Argiveer",
+ "positionVin": "VIN",
+ "positionApproximate": "Benader",
+ "positionThrottle": "Versneller",
+ "positionMotion": "Beweging ",
+ "positionArmed": "Gereed",
+ "positionAcceleration": "Versnelling",
+ "positionTemp": "Temperatuur",
+ "positionDeviceTemp": "Toestel Temperatuur",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operateur",
+ "positionCommand": "Bevel",
+ "positionBlocked": "Geblokkeer",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Spoed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Bestuurder unieke identiteit",
+ "positionCard": "Card",
+ "positionImage": "Beeld",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Bedienerinstellings",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registrasie",
+ "serverReadonly": "Leesalleen",
+ "serverForceSettings": "Dwing instellings",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Kaart",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Sleutel",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Kaartlaag",
+ "mapCustom": "Pasgemaak (XYZ)",
+ "mapCustomArcgis": "Pasgemaak (ArcGIS)",
+ "mapCustomLabel": "Pasgemaakte kaart",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Kaart Sleutel",
+ "mapBingRoad": "Bing Kaart Pad",
+ "mapBingAerial": "Bing Kaart Lug",
+ "mapBingHybrid": "Bing Kaart Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Kaart",
+ "mapYandexSat": "Yandex Satelliet",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Toegang Sleutel",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Sleutel",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Toegang Sleutel",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Sleutel",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Sleutel",
+ "mapShapePolygon": "Veelhoek",
+ "mapShapeCircle": "Sirkel",
+ "mapShapePolyline": "Veelhoeklyn",
+ "mapLiveRoutes": "Lewendige Routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Vlak",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Toestand",
+ "stateName": "Attribuut",
+ "stateValue": "Waarde",
+ "commandTitle": "Bevel",
+ "commandSend": "Stuur",
+ "commandSent": "Bevel gestuur",
+ "commandQueued": "Bevel in ry",
+ "commandUnit": "Eenheid",
+ "commandCustom": "Pasgemaakte bevel",
+ "commandDeviceIdentification": "Toestel Identifisering",
+ "commandPositionSingle": "Enkel Verslag",
+ "commandPositionPeriodic": "Periodiese Verslag",
+ "commandPositionStop": "Halt Verslag",
+ "commandEngineStop": "Engin Stop",
+ "commandEngineResume": "Engin Herbegin",
+ "commandAlarmArm": "Aktivering Alarm",
+ "commandAlarmDisarm": "Onaktivering Alarm",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Stel Tydsone",
+ "commandRequestPhoto": "Versoek Foto",
+ "commandPowerOff": "Skakel Toestel Af",
+ "commandRebootDevice": "Herbegin Toestel",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Stuur SMS",
+ "commandSendUssd": "Stuur USSD",
+ "commandSosNumber": "Stel SOS Nommer",
+ "commandSilenceTime": "Stel Stil Tyd",
+ "commandSetPhonebook": "Stel Telefoon boek",
+ "commandVoiceMessage": "Stemboodskap",
+ "commandOutputControl": "Uitsetbeheer",
+ "commandVoiceMonitoring": "Stemmonitering",
+ "commandSetAgps": "Stel AGPS",
+ "commandSetIndicator": "Stel aanwyser",
+ "commandConfiguration": "Konfigureer",
+ "commandGetVersion": "Kry weergawe",
+ "commandFirmwareUpdate": "Opdateer firmware",
+ "commandSetConnection": "Stel Verbinding",
+ "commandSetOdometer": "Stel Odometer",
+ "commandGetModemStatus": "Kry Modemstatus",
+ "commandGetDeviceStatus": "Kry Toestel Gestel",
+ "commandSetSpeedLimit": "Stel spoedbeperking",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Stel Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Stel Spoed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekwensie",
+ "commandTimezone": "Tydsone Verreken",
+ "commandMessage": "Boodskap",
+ "commandRadius": "Radius",
+ "commandEnable": "In Staat Stel",
+ "commandData": "Data",
+ "commandIndex": "Indeks",
+ "commandPhone": "Telefoon nommer",
+ "commandServer": "Bediener",
+ "commandPort": "Poort",
+ "eventAll": "Alle gebeure",
+ "eventDeviceOnline": "Status aanlyn",
+ "eventDeviceUnknown": "Status onbekend",
+ "eventDeviceOffline": "Status vanlyn",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Toestel in beweging",
+ "eventDeviceStopped": "Toestel tot stilstand gekom",
+ "eventDeviceOverspeed": "Spoedgrens oortree",
+ "eventDeviceFuelDrop": "Brandstofval",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Bevel resultaat",
+ "eventGeofenceEnter": "Geografiese omheining binnegegaan",
+ "eventGeofenceExit": "Geografiese omheining verlaat",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ontsteking aan",
+ "eventIgnitionOff": "Ontsteking af",
+ "eventMaintenance": "Onderhoud vereis",
+ "eventTextMessage": "Teks boodskap ontvang",
+ "eventDriverChanged": "Bestuurder geruil",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Blaai na laaste",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Algemeen",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibrasie",
+ "alarmMovement": "Beweging",
+ "alarmLowspeed": "Lae Spoed",
+ "alarmOverspeed": "Spoed oortreding",
+ "alarmFallDown": "Val af",
+ "alarmLowPower": "Lae krag",
+ "alarmLowBattery": "Batteryvlak laag",
+ "alarmFault": "Fout",
+ "alarmPowerOff": "Krag af",
+ "alarmPowerOn": "Krag aan",
+ "alarmDoor": "Deur",
+ "alarmLock": "Sluit",
+ "alarmUnlock": "Oopsluit",
+ "alarmGeofence": "Geografiese omheining",
+ "alarmGeofenceEnter": "Geografiese omheining binnegegaan",
+ "alarmGeofenceExit": "Geografiese omheining verlaat",
+ "alarmGpsAntennaCut": "GPS Antenna gesny",
+ "alarmAccident": "Ongeluk",
+ "alarmTow": "Sleep",
+ "alarmIdle": "Luier",
+ "alarmHighRpm": "Hoë RPM",
+ "alarmHardAcceleration": "Harde Versnelling",
+ "alarmHardBraking": "Harde Remming",
+ "alarmHardCornering": "Harde Draai",
+ "alarmLaneChange": "Baanverandering",
+ "alarmFatigueDriving": "Moeg Bestuur",
+ "alarmPowerCut": "Kragonderbreking",
+ "alarmPowerRestored": "Krag herstel",
+ "alarmJamming": "Seinverstoring",
+ "alarmTemperature": "Temperatuur",
+ "alarmParking": "Parkeer",
+ "alarmBonnet": "Enjinkap",
+ "alarmFootBrake": "Voetrem",
+ "alarmFuelLeak": "Brandstoflek",
+ "alarmTampering": "Peuter",
+ "alarmRemoving": "Verwydering",
+ "notificationType": "Kennisgewing Soort",
+ "notificationAlways": "Alle Toestelle",
+ "notificationNotificators": "Kanale",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Pos",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Roete",
+ "reportEvents": "Gebeure",
+ "reportTrips": "Ritte",
+ "reportStops": "Stops",
+ "reportSummary": "Opsomming",
+ "reportDaily": "Daaglikse Opsomming",
+ "reportChart": "Grafiek",
+ "reportConfigure": "Konfigureer",
+ "reportEventTypes": "Gebeurtenistipes",
+ "reportChartType": "Grafiek Soort",
+ "reportShowMarkers": "Wys Merkers",
+ "reportExport": "Uitvoer",
+ "reportEmail": "E-pos Verslag",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Periode",
+ "reportCustom": "Pasgemaak",
+ "reportToday": "Vandag",
+ "reportYesterday": "Gister",
+ "reportThisWeek": "Hierdie Week",
+ "reportPreviousWeek": "Vorige Week",
+ "reportThisMonth": "Hierdie Maand",
+ "reportPreviousMonth": "Vorige Maand",
+ "reportDeviceName": "Toestel Naam",
+ "reportAverageSpeed": "Gemiddelde Spoed",
+ "reportMaximumSpeed": "Maksimum Spoed",
+ "reportEngineHours": "Engin Ure",
+ "reportDuration": "Duur",
+ "reportStartDate": "Begindatum",
+ "reportStartTime": "Begin tyd",
+ "reportStartAddress": "Begin Adres",
+ "reportEndTime": "Einde tyd",
+ "reportEndAddress": "Einde Adres",
+ "reportSpentFuel": "Brandstof Gebruik",
+ "reportStartOdometer": "Odometer Begin",
+ "reportEndOdometer": "Odometer Einde",
+ "statisticsTitle": "Statistieke",
+ "statisticsCaptureTime": "Vang tyd vas",
+ "statisticsActiveUsers": "Aktiewe Gebruikers",
+ "statisticsActiveDevices": "Aktiewe Toestelle",
+ "statisticsRequests": "Versoeke",
+ "statisticsMessagesReceived": "Boodskappe ontvang",
+ "statisticsMessagesStored": "Boodskappe gestoor",
+ "statisticsGeocoder": "Geokodeerder Versoeke",
+ "statisticsGeolocation": "Geoligging Versoeke",
+ "categoryArrow": "Pyl",
+ "categoryDefault": "Verstrek",
+ "categoryAnimal": "Dier",
+ "categoryBicycle": "Fiets",
+ "categoryBoat": "Boot",
+ "categoryBus": "Bus",
+ "categoryCar": "Kar",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Hyskraan",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motorfiets",
+ "categoryOffroad": "Veeldoelig",
+ "categoryPerson": "Persoon",
+ "categoryPickup": "Bakkie",
+ "categoryPlane": "Vliegtuig",
+ "categoryShip": "Skip",
+ "categoryTractor": "Trekker",
+ "categoryTrain": "Trein",
+ "categoryTram": "Trem",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Trok",
+ "categoryVan": "Paneelwa",
+ "categoryScooter": "Moffiebike",
+ "maintenanceStart": "Aan",
+ "maintenancePeriod": "Periode"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ar.json b/legacy/web/l10n/ar.json
new file mode 100644
index 00000000..19f4c9d8
--- /dev/null
+++ b/legacy/web/l10n/ar.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "جاري التحميل...",
+ "sharedHide": "إخفاء",
+ "sharedSave": "حفظ",
+ "sharedUpload": "Upload",
+ "sharedSet": "ضبط",
+ "sharedCancel": "إلغاء",
+ "sharedCopy": "Copy",
+ "sharedAdd": "إضافة",
+ "sharedEdit": "تعديل",
+ "sharedRemove": "حذف",
+ "sharedRemoveConfirm": "حذف العنصر؟",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "نعم",
+ "sharedNo": "لا",
+ "sharedKm": "كم",
+ "sharedMi": "ميل",
+ "sharedNmi": "معرف العداد المحلي",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "عقدة",
+ "sharedKmh": "كم/ساعه",
+ "sharedMph": "ميل/ساعة",
+ "sharedHour": "ساعه",
+ "sharedMinute": "دقيقة",
+ "sharedSecond": "ثانية",
+ "sharedDays": "أيام",
+ "sharedHours": "ساعات",
+ "sharedMinutes": "دقائق",
+ "sharedDecimalDegrees": "درجات عشرية",
+ "sharedDegreesDecimalMinutes": "درجات عشرية للدقائق",
+ "sharedDegreesMinutesSeconds": "درجات دقائق للثواني",
+ "sharedName": "الاسم",
+ "sharedDescription": "الوصف",
+ "sharedSearch": "بحث",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "السياج الجغرافي",
+ "sharedGeofences": "السياجات الجغرافية",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "التنبيهات",
+ "sharedNotification": "إشعار",
+ "sharedAttributes": "الخصائص",
+ "sharedAttribute": "خاصية",
+ "sharedDrivers": "السائقون",
+ "sharedDriver": "السائق",
+ "sharedArea": "منطقة",
+ "sharedSound": "صوت التنبيهات",
+ "sharedType": "النوع",
+ "sharedDistance": "المسافة",
+ "sharedHourAbbreviation": "س",
+ "sharedMinuteAbbreviation": "د",
+ "sharedSecondAbbreviation": "ث",
+ "sharedVoltAbbreviation": "جهد كهربائي",
+ "sharedLiterAbbreviation": "تيار",
+ "sharedGallonAbbreviation": "جالون",
+ "sharedLiter": "ليتر",
+ "sharedImpGallon": "جالون الإمبراطورية",
+ "sharedUsGallon": "جالون أمريكي",
+ "sharedLiterPerHourAbbreviation": "لتر/ساعة",
+ "sharedGetMapState": "الحصول على حالة الخريطة",
+ "sharedComputedAttribute": "السمة المحصاة",
+ "sharedComputedAttributes": "السمات المحصاة",
+ "sharedCheckComputedAttribute": "التحقق من السمة المحصاة",
+ "sharedExpression": "العبارة الجبرية",
+ "sharedDevice": "جهاز",
+ "sharedTest": "Test",
+ "sharedTestNotification": "ارسل تنبيه تجريبي",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "التقويم",
+ "sharedCalendars": "التقويمات",
+ "sharedFile": "ملف",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "حدد ملف",
+ "sharedPhone": "هاتف",
+ "sharedRequired": "اجباري",
+ "sharedPreferences": "التفضيلات",
+ "sharedPermissions": "الصلاحيات",
+ "sharedConnections": "الاتصالات",
+ "sharedExtra": "إضافي",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "نص",
+ "sharedTypeNumber": "رقم",
+ "sharedTypeBoolean": "منطقية",
+ "sharedTimezone": "منطقة زمنية",
+ "sharedInfoTitle": "معلومات",
+ "sharedSavedCommand": "أمر مخزن",
+ "sharedSavedCommands": "أوامر مخزنة",
+ "sharedNew": "جديد...",
+ "sharedShowAddress": "إظهار العنوان",
+ "sharedShowDetails": "تفاصيل إضافية",
+ "sharedDisabled": "معطل",
+ "sharedMaintenance": "صيانة",
+ "sharedDeviceAccumulators": "المراكم",
+ "sharedAlarms": "الإنذارات",
+ "sharedLocation": "الموقع",
+ "sharedImport": "استيراد",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "الحد الأقصى للسرعة",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "مسافة متعددة الخطوط",
+ "attributeReportIgnoreOdometer": "تقرير: إهمال عداد المسافة",
+ "attributeWebReportColor": "الويب: لون التقرير",
+ "attributeDevicePassword": "الرقم السري للجهاز",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "بداية عدم فعالية الجهاز",
+ "attributeDeviceInactivityPeriod": "فترة عدم فعالية الجهاز",
+ "attributeProcessingCopyAttributes": "المعالجة: نسخ السمات",
+ "attributeColor": "اللون",
+ "attributeWebLiveRouteLength": "الويب: طول العرض المباشر للمسار",
+ "attributeWebSelectZoom": "الويب: التقريب عند التحديد",
+ "attributeWebMaxZoom": "ويب: التكبير الأقصى",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "البريد: مستضيف الـ SMTP",
+ "attributeMailSmtpPort": "البريد: منفذ الـ SMTP",
+ "attributeMailSmtpStarttlsEnable": "البريد: تمكين SMTP SSL",
+ "attributeMailSmtpStarttlsRequired": "البريد: مطلوب SMTP SSL",
+ "attributeMailSmtpSslEnable": "البريد: تمكين SMTP SSL",
+ "attributeMailSmtpSslTrust": "البريد: وثوق بـ SMTP SSL",
+ "attributeMailSmtpSslProtocols": "البريد: بروتوكولات SMTP SSL",
+ "attributeMailSmtpFrom": "البريد: SMTP من",
+ "attributeMailSmtpAuth": "البريد: تفعيل مصادقة SMTP",
+ "attributeMailSmtpUsername": "البريد: أسم مستخدم الـ SMTP",
+ "attributeMailSmtpPassword": "البريد: كلمة مرور الـ SMTP",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "واجهة المستخدم: تعطيل الأحداث",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "واجهة المستخدم: تعطيل السائقين",
+ "attributeUiDisableComputedAttributes": "واجهة المستخدم: تعطيل السمات المحصاة",
+ "attributeUiDisableCalendars": "واجهة المستخدم: تعطيل التقويمات",
+ "attributeUiDisableMaintenance": "واجهة المستخدم: تعطيل الصيانة",
+ "attributeUiHidePositionAttributes": "واجهة المستخدم: إخفاء سمات الموقع",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "رموز الإشعارات",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "خطأ",
+ "errorGeneral": "معطيات غير صحيحة او مخالفة للصلاحيات",
+ "errorConnection": "خطأ في الاتصال",
+ "errorSocket": "خطأ في اتصال حزم البيانات",
+ "errorZero": "لا يمكن ان تكون صفر",
+ "userEmail": "البريد الالكتروني",
+ "userPassword": "كلمة المرور",
+ "userAdmin": "مدير النظام",
+ "userRemember": "تذكر",
+ "userExpirationTime": "انتهاء الصلاحية",
+ "userDeviceLimit": "الحد الأقصى للأجهزة",
+ "userUserLimit": "الحد الأقصى للمستخدمين",
+ "userDeviceReadonly": "جهاز للقراءة فقط",
+ "userLimitCommands": "تقييد الاوامر",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "رمز",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "تسجيل الدخول",
+ "loginLanguage": "اللغة",
+ "loginReset": "Reset Password",
+ "loginRegister": "تسجيل جديد",
+ "loginLogin": "تسجيل الدخول",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "البريد الالكتروني أو كلمة المرور غير صحيحة",
+ "loginCreated": "تم تسجيل مستخدم جديد",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "تسجيل الخروج",
+ "loginLogo": "الشعار",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "الأجهزة والحالة",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "الأجهزة",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "المعرف",
+ "deviceModel": "الطراز",
+ "deviceContact": "بيانات التواصل",
+ "deviceCategory": "الصنف",
+ "deviceLastUpdate": "آخر تحديث",
+ "deviceCommand": "أمر",
+ "deviceFollow": "متابعة",
+ "deviceTotalDistance": "المسافة الكلية",
+ "deviceStatus": "الحالة",
+ "deviceStatusOnline": "متصل",
+ "deviceStatusOffline": "غير متصل",
+ "deviceStatusUnknown": "غير معروف",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "مجموعة",
+ "groupParent": "مجموعة",
+ "groupNoGroup": "لا توجد مجموعة",
+ "settingsTitle": "الإعدادات",
+ "settingsUser": "الحساب",
+ "settingsGroups": "المجموعات",
+ "settingsServer": "الخادم",
+ "settingsUsers": "المستخدمون",
+ "settingsDistanceUnit": "وحدة المسافة",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "وحدة السرعة",
+ "settingsVolumeUnit": "وحدة الحجم",
+ "settingsTwelveHourFormat": "صيغة 12-ساعة",
+ "settingsCoordinateFormat": "صيغة الإحداثيات",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "التقارير",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "الجهاز",
+ "reportGroup": "المجموعة",
+ "reportFrom": "من",
+ "reportTo": "الى",
+ "reportShow": "إظهار",
+ "reportClear": "تفريغ الحقول",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "صالح",
+ "positionAccuracy": "الدقة",
+ "positionLatitude": "خط العرض",
+ "positionLongitude": "خط الطول",
+ "positionAltitude": "ارتفاع عن سطح البحر",
+ "positionSpeed": "السرعة",
+ "positionCourse": "الإتجاه",
+ "positionAddress": "العنوان",
+ "positionProtocol": "بروتوكول",
+ "positionDistance": "المسافة",
+ "positionRpm": "دورة في الدقيقة",
+ "positionFuel": "الوقود",
+ "positionPower": "الطاقة",
+ "positionBattery": "بطارية",
+ "positionRaw": "خام",
+ "positionIndex": "قائمة",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "أقمار صناعية",
+ "positionSatVisible": "الأقمار الصناعية المرئية",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "التجوال",
+ "positionEvent": "حدث",
+ "positionAlarm": "إنذار",
+ "positionStatus": "الحالة",
+ "positionOdometer": "عداد المسافة",
+ "positionServiceOdometer": "عداد مسافة الصيانة",
+ "positionTripOdometer": "عداد مسافة الرحلة",
+ "positionHours": "الساعات",
+ "positionSteps": "الخطوات",
+ "positionInput": "مدخلات",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "نواتج",
+ "positionBatteryLevel": "مستوى البطارية",
+ "positionFuelConsumption": "الوقود المستهلك",
+ "positionRfid": "RFID",
+ "positionVersionFw": "نسخة البرنامج",
+ "positionVersionHw": "نسخة الجهاز",
+ "positionIgnition": "إشعال",
+ "positionFlags": "أعلام",
+ "positionCharge": "شحن",
+ "positionIp": "عنوان البروتوكول",
+ "positionArchive": "أرشفة",
+ "positionVin": "رقم الهيكل",
+ "positionApproximate": "تقريبي",
+ "positionThrottle": "الخانق",
+ "positionMotion": "الحركة",
+ "positionArmed": "الانذار مفعل",
+ "positionAcceleration": "التسارع",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "حرارة الجهاز",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "المشغل",
+ "positionCommand": "أمر",
+ "positionBlocked": "محظور",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "سرعة OBD",
+ "positionObdOdometer": "عداد مسافة OBD",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "معرف فريد للسائق",
+ "positionCard": "Card",
+ "positionImage": "صورة",
+ "positionVideo": "Video",
+ "positionAudio": "صوت",
+ "serverTitle": "اعدادت الخادم",
+ "serverZoom": "تقريب",
+ "serverRegistration": "تسجيل",
+ "serverReadonly": "متابعة فقط",
+ "serverForceSettings": "إجبار الإعدادات",
+ "serverAnnouncement": "الإعلانات",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "خريطة",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "طبقة الخريطة",
+ "mapCustom": "مخصص (XYZ)",
+ "mapCustomArcgis": "مخصص (ArcGIS)",
+ "mapCustomLabel": "خريطة مخصصة",
+ "mapCarto": "خرائط Carto Base",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "مفتاح خرائط Bing",
+ "mapBingRoad": "خرائط الطرق Bing",
+ "mapBingAerial": "خرائط جوية Bing",
+ "mapBingHybrid": "خرائط هجينة Bing",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "خرائط Yandex",
+ "mapYandexSat": "خرائط صورية Yandex",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox للشوارع",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox بالخارج",
+ "mapMapboxSatellite": "Mapbox بالقمر الصناعي",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "مضلع",
+ "mapShapeCircle": "دائرة",
+ "mapShapePolyline": "متعدد الضلوع",
+ "mapLiveRoutes": "مسار حي",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "طبقة POI نقاط الإهتمام",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "حالة",
+ "stateName": "خاصية",
+ "stateValue": "قيمة",
+ "commandTitle": "أمر",
+ "commandSend": "ارسال",
+ "commandSent": "تم ارسال الامر",
+ "commandQueued": "الامر في قائمة الانتظار",
+ "commandUnit": "وحدة",
+ "commandCustom": "أمر مخصص",
+ "commandDeviceIdentification": "تعريف الجهاز",
+ "commandPositionSingle": "تقرير مفرد",
+ "commandPositionPeriodic": "تقارير دورية",
+ "commandPositionStop": "ايقاف التقرير",
+ "commandEngineStop": "ايقاف المحرك",
+ "commandEngineResume": "استئناف المحرك",
+ "commandAlarmArm": "بدء تشغيل المنبه",
+ "commandAlarmDisarm": "تعطيل المنبه",
+ "commandAlarmDismiss": "إيقاف المنبه",
+ "commandSetTimezone": "حدد المنطقة الزمنية",
+ "commandRequestPhoto": "اطلب صورة",
+ "commandPowerOff": "اطفاء الجهاز",
+ "commandRebootDevice": "أعد تشغيل الجهاز",
+ "commandFactoryReset": "إعادة ضبط المصنع",
+ "commandSendSms": "إرسال رسالة قصيرة",
+ "commandSendUssd": "إرسال الـ USSD",
+ "commandSosNumber": "ظبط رقم الطوارئ",
+ "commandSilenceTime": "حدد التوقيت الصامت",
+ "commandSetPhonebook": "ضبط سجل الهاتف",
+ "commandVoiceMessage": "رسالة صوتية",
+ "commandOutputControl": "التحكم بالإخراج",
+ "commandVoiceMonitoring": "مراقبة صوتية",
+ "commandSetAgps": "تعيين GPS المساعد",
+ "commandSetIndicator": "تعيين المؤشر",
+ "commandConfiguration": "ضبط",
+ "commandGetVersion": "الحصول على الإصدار",
+ "commandFirmwareUpdate": "تحديث البرنامج المشغل",
+ "commandSetConnection": "تعيين اتصال",
+ "commandSetOdometer": "تعيين عداد المسافة",
+ "commandGetModemStatus": "الحصول على حالة المودم",
+ "commandGetDeviceStatus": "الحصول على حالة الجهاز",
+ "commandSetSpeedLimit": "ضبط حد السرعة",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "التكرر",
+ "commandTimezone": "إزاحة المنطقة الزمنية",
+ "commandMessage": "رسالة",
+ "commandRadius": "القطر",
+ "commandEnable": "تفعيل",
+ "commandData": "بيانات",
+ "commandIndex": "قائمة",
+ "commandPhone": "رقم الهاتف",
+ "commandServer": "خادم",
+ "commandPort": "منفذ",
+ "eventAll": "جميع الأحداث",
+ "eventDeviceOnline": "الحالة متصل",
+ "eventDeviceUnknown": "الحالة غير معروف",
+ "eventDeviceOffline": "الحالة غير متصل",
+ "eventDeviceInactive": "الجهاز غير مفعل",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "الجهاز يتحرك",
+ "eventDeviceStopped": "الجهاز متوقف",
+ "eventDeviceOverspeed": "تجاوز للسرعة",
+ "eventDeviceFuelDrop": "انخفاض الوقود",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "نتيجة الأمر",
+ "eventGeofenceEnter": "دخول المنطقة الجغرافية",
+ "eventGeofenceExit": "خروج من المنطقة الجغرافية",
+ "eventAlarm": "إنذار",
+ "eventIgnitionOn": "اشعال المحرك",
+ "eventIgnitionOff": "ايقاف المحرك",
+ "eventMaintenance": "حان وقت الصيانة",
+ "eventTextMessage": "تم استلام رسالة نصية",
+ "eventDriverChanged": "تم تغيير السائق",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "الانتقال للأخير",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "عام",
+ "alarmSos": "استغاثة",
+ "alarmVibration": "اهتزاز",
+ "alarmMovement": "حركة",
+ "alarmLowspeed": "سرعة منخفضة",
+ "alarmOverspeed": "تجاوز السرعة",
+ "alarmFallDown": "سقوط",
+ "alarmLowPower": "طاقة منخفضة",
+ "alarmLowBattery": "انخفاض البطارية",
+ "alarmFault": "خلل",
+ "alarmPowerOff": "اطفاء",
+ "alarmPowerOn": "تشغيل",
+ "alarmDoor": "باب",
+ "alarmLock": "اقفال",
+ "alarmUnlock": "فتح",
+ "alarmGeofence": "سياج جغرافي",
+ "alarmGeofenceEnter": "دخول السياج الجغرافي",
+ "alarmGeofenceExit": "الخروج من السياج الجغرافي",
+ "alarmGpsAntennaCut": "انقطاع هوائي القمر الصناعي",
+ "alarmAccident": "حادث",
+ "alarmTow": "جر",
+ "alarmIdle": "خامل",
+ "alarmHighRpm": "دوران في الدقيقة عالٍ",
+ "alarmHardAcceleration": "تسارع شديد",
+ "alarmHardBraking": "كبح فرامل شديد",
+ "alarmHardCornering": "انعطاف شديد",
+ "alarmLaneChange": "تغيير الممر",
+ "alarmFatigueDriving": "قيادة في حالة تعب",
+ "alarmPowerCut": "انقطاء الطاقة",
+ "alarmPowerRestored": "استعادة الطاقة",
+ "alarmJamming": "التشويش",
+ "alarmTemperature": "الحرارة",
+ "alarmParking": "اصطفاف",
+ "alarmBonnet": "غطاء محرك السيارة",
+ "alarmFootBrake": "فرامل القدم",
+ "alarmFuelLeak": "تسرب وقود",
+ "alarmTampering": "عبث وتلاعب",
+ "alarmRemoving": "الازالة",
+ "notificationType": "نوع التنبيه",
+ "notificationAlways": "جميع الاجهزة",
+ "notificationNotificators": "قنواة",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "ويب",
+ "notificatorMail": "البريد",
+ "notificatorSms": "رسائل قصيرة",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "إعادة تشغيل",
+ "reportCombined": "Combined",
+ "reportRoute": "مسار",
+ "reportEvents": "الأحداث",
+ "reportTrips": "رحلات",
+ "reportStops": "وقفات",
+ "reportSummary": "ملخص",
+ "reportDaily": "الملخص اليومي",
+ "reportChart": "رسم بياني",
+ "reportConfigure": "تهيئة",
+ "reportEventTypes": "أنواع الأحداث",
+ "reportChartType": "نوع الرسم البياني",
+ "reportShowMarkers": "إظهار العلامات",
+ "reportExport": "تصدير",
+ "reportEmail": "تقرير بالبريد",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "الفترة",
+ "reportCustom": "مخصص",
+ "reportToday": "اليوم",
+ "reportYesterday": "أمس",
+ "reportThisWeek": "هذا الاسبوع",
+ "reportPreviousWeek": "الاسبوع السابق",
+ "reportThisMonth": "هذا الشهر",
+ "reportPreviousMonth": "الشهر السابق",
+ "reportDeviceName": "إسم الجهاز",
+ "reportAverageSpeed": "متوسط السرعة",
+ "reportMaximumSpeed": "السرعة القصوى",
+ "reportEngineHours": "ساعات عمل المحرك",
+ "reportDuration": "المدة الزمنية",
+ "reportStartDate": "تاريخ البدء",
+ "reportStartTime": "وقت البدء",
+ "reportStartAddress": "عنوان البدء",
+ "reportEndTime": "وقت النهاية",
+ "reportEndAddress": "عنوان النهاية",
+ "reportSpentFuel": "الوقود المستنفد",
+ "reportStartOdometer": "بدء عداد المسافة",
+ "reportEndOdometer": "إنهاء Odometer",
+ "statisticsTitle": "إحصائيات",
+ "statisticsCaptureTime": "وقت الالتقاط",
+ "statisticsActiveUsers": "المستخدمون النشطون",
+ "statisticsActiveDevices": "الاجهزة النشطة",
+ "statisticsRequests": "طلبات",
+ "statisticsMessagesReceived": "الرسائل المستلمة",
+ "statisticsMessagesStored": "الرسائل المخزنة",
+ "statisticsGeocoder": "طلبات Geocoder",
+ "statisticsGeolocation": "طلبات تحديد الموقع الجغرافي",
+ "categoryArrow": "سهم",
+ "categoryDefault": "افتراضي",
+ "categoryAnimal": "حيوان",
+ "categoryBicycle": "دراجة هوائية",
+ "categoryBoat": "قارب",
+ "categoryBus": "حافلة",
+ "categoryCar": "سيارة",
+ "categoryCamper": "Camper",
+ "categoryCrane": "رافعة ونش",
+ "categoryHelicopter": "طائرة مروحية",
+ "categoryMotorcycle": "دراجة نارية",
+ "categoryOffroad": "رباعية",
+ "categoryPerson": "شخص",
+ "categoryPickup": "شاحنة صغيرة",
+ "categoryPlane": "طائرة",
+ "categoryShip": "سفينة",
+ "categoryTractor": "جرار زراعى",
+ "categoryTrain": "قطار",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "شاحنة",
+ "categoryVan": "نقل",
+ "categoryScooter": "سكوتر",
+ "maintenanceStart": "بداية",
+ "maintenancePeriod": "فترة"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/az.json b/legacy/web/l10n/az.json
new file mode 100644
index 00000000..02430a47
--- /dev/null
+++ b/legacy/web/l10n/az.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Yükləmə...",
+ "sharedHide": "Gizlətmək",
+ "sharedSave": "Yadda saxlamaq",
+ "sharedUpload": "Upload",
+ "sharedSet": "Qurmaq",
+ "sharedCancel": "Ləğv etmək",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Əlavə etmək",
+ "sharedEdit": "Redaktə etmək",
+ "sharedRemove": "Silmək",
+ "sharedRemoveConfirm": "Elementi silmək?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "km",
+ "sharedMi": "mil",
+ "sharedNmi": "m.mil",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "Düyün",
+ "sharedKmh": "km/saat",
+ "sharedMph": "mil/saat",
+ "sharedHour": "Saat",
+ "sharedMinute": "Dəqiqə",
+ "sharedSecond": "Saniyə",
+ "sharedDays": "Günlər",
+ "sharedHours": "Saatlar",
+ "sharedMinutes": "Dəqiqələr",
+ "sharedDecimalDegrees": "Onluq dərəcələr",
+ "sharedDegreesDecimalMinutes": "Dərəcələr Onluq Dəqiqələr",
+ "sharedDegreesMinutesSeconds": "Dərəcələr Dəqiqələr Saniyələr",
+ "sharedName": "Ad",
+ "sharedDescription": "Təsvir",
+ "sharedSearch": "Axtarış",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geozona",
+ "sharedGeofences": "Geozonalar",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Bildirişlər",
+ "sharedNotification": "Bildirişlər",
+ "sharedAttributes": "Atributlar",
+ "sharedAttribute": "Atribut",
+ "sharedDrivers": "Sürücülər",
+ "sharedDriver": "Sürücü",
+ "sharedArea": "Ərazi",
+ "sharedSound": "Səsli xəbərdarlıq",
+ "sharedType": "Tip",
+ "sharedDistance": "Məsafə",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "dəq",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "litr/saat",
+ "sharedGetMapState": "Xəritənin vəziyyətini almaq",
+ "sharedComputedAttribute": "Hesablanan atribut",
+ "sharedComputedAttributes": "Hesablanan atributlar",
+ "sharedCheckComputedAttribute": "Hesablanan atributu yoxlamaq",
+ "sharedExpression": "İfadə",
+ "sharedDevice": "Cihaz",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Test bildirişi göndərmək",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Təqvim",
+ "sharedCalendars": "Təqvimlər",
+ "sharedFile": "Fayl",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Fayl seçin",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Məcburi",
+ "sharedPreferences": "Tənzimləmələr",
+ "sharedPermissions": "İzinlər",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Əlavə",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Sətir",
+ "sharedTypeNumber": "Rəqəm",
+ "sharedTypeBoolean": "Məntiqi dəyəri",
+ "sharedTimezone": "Saat qurşağı",
+ "sharedInfoTitle": "Məlumat",
+ "sharedSavedCommand": "Tarif Saxlamish",
+ "sharedSavedCommands": "Tarifler Saxlamish",
+ "sharedNew": "yeni",
+ "sharedShowAddress": "şou ünvan",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "şikəst",
+ "sharedMaintenance": "təmir",
+ "sharedDeviceAccumulators": "akkumulyatorlar",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Sürət həddi",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline məsafə",
+ "attributeReportIgnoreOdometer": "Hesabat: Odometri rədd etməki",
+ "attributeWebReportColor": "Veb: Hesabat rəngi",
+ "attributeDevicePassword": "Cihazın şifrəsi",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Emal: Atributların üzünün köçürülməsi",
+ "attributeColor": "Rəng",
+ "attributeWebLiveRouteLength": "Veb: Onlayn marşrutun uzunluğu",
+ "attributeWebSelectZoom": "Veb: Seçim zamanı böyütmə",
+ "attributeWebMaxZoom": "Veb: Maksimum böyütmə",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Poçt: SMTP Hostu",
+ "attributeMailSmtpPort": "Poçt: SMTP Portu",
+ "attributeMailSmtpStarttlsEnable": "Poçt: SMTP STARTTLS-i aktiv etmək",
+ "attributeMailSmtpStarttlsRequired": "Poçt: SMTP STARTTLS tələb olunur",
+ "attributeMailSmtpSslEnable": "Poçt: SMTP SSL-i aktiv etmək",
+ "attributeMailSmtpSslTrust": "Poçt: SMTP SSL etibar",
+ "attributeMailSmtpSslProtocols": "Poçt: SMTP SSL protokolları",
+ "attributeMailSmtpFrom": "Poçt: SMTP göndərən",
+ "attributeMailSmtpAuth": "Poçt: SMTP autentifikasiyasını aktiv etmək",
+ "attributeMailSmtpUsername": "Poçt: SMTP istifadəçi adı",
+ "attributeMailSmtpPassword": "Poçt: SMTP şifrə",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: şikəst vaqiəler",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Sürücüləri deaktiv etmək",
+ "attributeUiDisableComputedAttributes": "UI: Hesablanılan atributları deaktiv etmək",
+ "attributeUiDisableCalendars": "UI: Təqvimləri deaktiv etmək",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI : Vəzifə xüsusiyyətlərini gizləyin",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Xəta",
+ "errorGeneral": "Yanlış parametrlər və ya məhdudiyyətlərin pozulması",
+ "errorConnection": "Bağlantı xətası",
+ "errorSocket": "Veb socket bağlantı xətası",
+ "errorZero": "Sıfır ola bilməz",
+ "userEmail": "E-poçt",
+ "userPassword": "Şifrə",
+ "userAdmin": "Administrator",
+ "userRemember": "Yadda saxla",
+ "userExpirationTime": "Bitmə vaxtı",
+ "userDeviceLimit": "Cihaz məhdudiyyəti",
+ "userUserLimit": "İstifadəçilərin məhdudiyyəti",
+ "userDeviceReadonly": "Sadəcə cihaza baxış",
+ "userLimitCommands": "Komandaları məhdudlaşdırın",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Açar",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Giriş",
+ "loginLanguage": "Dil",
+ "loginReset": "Reset Password",
+ "loginRegister": "Qeydiyyat",
+ "loginLogin": "Giriş",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Yanlış e-poçt ünvanı və ya şifrə",
+ "loginCreated": "Yeni istifadəçi qeydiyyatdan keçmişdir",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Çıxış",
+ "loginLogo": "Giriş",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Cihaz və vəziyyəti",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Cihaz",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "İdentifikator",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kateqoriya",
+ "deviceLastUpdate": "Son yenilənmə",
+ "deviceCommand": "Komanda",
+ "deviceFollow": "Əməl etmək",
+ "deviceTotalDistance": "Ümumi hərəkət məsafəsi",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Onlayn",
+ "deviceStatusOffline": "Offlayn",
+ "deviceStatusUnknown": "Naməlum",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Qrup",
+ "groupParent": "Qrup",
+ "groupNoGroup": "Qrupsuz",
+ "settingsTitle": "Tənzimləmələr",
+ "settingsUser": "İstifadəçi Hesabı",
+ "settingsGroups": "Qruplar",
+ "settingsServer": "Server",
+ "settingsUsers": "İstifadəçilər",
+ "settingsDistanceUnit": "Məsafə vahidi",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Sürət",
+ "settingsVolumeUnit": "Həcm vahidi",
+ "settingsTwelveHourFormat": "12 saatlıq format",
+ "settingsCoordinateFormat": "Koordinatlar formatı",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Hesabatlar",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Cihaz",
+ "reportGroup": "Qrup",
+ "reportFrom": "dan",
+ "reportTo": "dək",
+ "reportShow": "Göstərmək",
+ "reportClear": "Təmizləmək",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Düzgünlük",
+ "positionAccuracy": "Dəqiqlik",
+ "positionLatitude": "En dairəsi",
+ "positionLongitude": "Uzunluq dairəsi",
+ "positionAltitude": "Hündürlük",
+ "positionSpeed": "Sürət",
+ "positionCourse": "İstiqamət",
+ "positionAddress": "Ünvan",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Məsafə",
+ "positionRpm": "Dönmələr",
+ "positionFuel": "Yanacaq",
+ "positionPower": "Qidalanma",
+ "positionBattery": "Batareya",
+ "positionRaw": "Natamamlar",
+ "positionIndex": "İndeks",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Peyklər",
+ "positionSatVisible": "Görünən peyklər",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Hadisə",
+ "positionAlarm": "Həyəcan",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometr",
+ "positionServiceOdometer": "Xidmət odometri",
+ "positionTripOdometer": "Gediş odometri",
+ "positionHours": "Saatlar",
+ "positionSteps": "Addımlar",
+ "positionInput": "Daxilolmalar",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Çıxışlar",
+ "positionBatteryLevel": "Batareya səviyyəsi",
+ "positionFuelConsumption": "Yanacaq sərfiyyatı",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Tikilmə versiyası",
+ "positionVersionHw": "Metal versiyası",
+ "positionIgnition": "İşə düşmə",
+ "positionFlags": "Bayraqlar",
+ "positionCharge": "Yükləmə",
+ "positionIp": "IP",
+ "positionArchive": "Arxiv",
+ "positionVin": "VIN",
+ "positionApproximate": "Təxmini",
+ "positionThrottle": "Drossel",
+ "positionMotion": "Hərəkət",
+ "positionArmed": "Mühafizə",
+ "positionAcceleration": "Sürətlənmə",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Cihazın temperaturu",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Komanda",
+ "positionBlocked": "Bloklama",
+ "positionDtcs": "Səhvlər",
+ "positionObdSpeed": "OBD sürət",
+ "positionObdOdometer": "OBD odometr",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Sürücü İD-si",
+ "positionCard": "Card",
+ "positionImage": "Şəkil",
+ "positionVideo": "Video",
+ "positionAudio": "səs",
+ "serverTitle": "Server tənzimləmələri",
+ "serverZoom": "Yaxınlaşma",
+ "serverRegistration": "Qeydiyyat",
+ "serverReadonly": "Sadəcə baxış",
+ "serverForceSettings": "Tənzimləmələri sürətləndirmək",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Xəritə",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Xəritə qatı",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Çoxbucaq",
+ "mapShapeCircle": "Dairə",
+ "mapShapePolyline": "Xətt",
+ "mapLiveRoutes": "Canlı marşrutlar",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI təbəqə",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Vəziyyət",
+ "stateName": "Parametr",
+ "stateValue": "Dəyər",
+ "commandTitle": "Komanda",
+ "commandSend": "Göndərmək",
+ "commandSent": "Komandir göndərildi",
+ "commandQueued": "Command queued",
+ "commandUnit": "Vahidlər",
+ "commandCustom": "İstifadəçi komandası",
+ "commandDeviceIdentification": "Cihazın identifikasiyası",
+ "commandPositionSingle": "Birdəfəlik təqib",
+ "commandPositionPeriodic": "Təqibi başlamaq",
+ "commandPositionStop": "Təqibi dayandırmaq",
+ "commandEngineStop": "Mühərriki bloklamaq",
+ "commandEngineResume": "Mühərriki blokdan çıxarmaq",
+ "commandAlarmArm": "Siqnalizasiyanı aktivləşdirmək",
+ "commandAlarmDisarm": "Siqnalizasiyanı deaktivləşdirmək",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Saat qurşağını tənzimləmək",
+ "commandRequestPhoto": "Şəkil tələb etmək",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Cihazı yenidən yükləmək",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "SMS göndərmək",
+ "commandSendUssd": "USSD göndərmək",
+ "commandSosNumber": "SOS nömrəni tənzimləmək",
+ "commandSilenceTime": "Sükut vaxtını tənzimləmək",
+ "commandSetPhonebook": "Telefon kitabçasını tənzimləmək",
+ "commandVoiceMessage": "Səsli ismarıc",
+ "commandOutputControl": "Çıxışın yoxlanması",
+ "commandVoiceMonitoring": "Səs yoxlaması",
+ "commandSetAgps": "AGPS-i tənzimləmək",
+ "commandSetIndicator": "İndikatoru tənzimləmək",
+ "commandConfiguration": "Konfiqurasiya",
+ "commandGetVersion": "Versiyanı müəyyənləşdirmək",
+ "commandFirmwareUpdate": "Tikilməni yeniləmək",
+ "commandSetConnection": "Bağlantını tənzimləmək",
+ "commandSetOdometer": "Odometri tənzimləmək",
+ "commandGetModemStatus": "Modemin vəziyyətini müəyyənləşdirmək",
+ "commandGetDeviceStatus": "Cihazın vəziyyətini müəyyənləşdirmək",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Tezlik",
+ "commandTimezone": "Vaxt zonasının yerdəyişməsi",
+ "commandMessage": "İsmarıc",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Verilənlər",
+ "commandIndex": "Indeks",
+ "commandPhone": "Telefon nömrəs",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Bütün hadisələr",
+ "eventDeviceOnline": "vəziyyət online",
+ "eventDeviceUnknown": "vəziyyət unknown",
+ "eventDeviceOffline": "vəziyyət offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Cihaz hərəkət edir",
+ "eventDeviceStopped": "Aygıt durdu",
+ "eventDeviceOverspeed": "Sürət həddi aşıldı",
+ "eventDeviceFuelDrop": "Yanacaq düşməsi",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Komanda nəticəsi",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "qudok",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Texniki xidmətə ehtiyac var",
+ "eventTextMessage": "Mətn ismarıcı alındı",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Sonadək fırlanma",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "fəlakət siqnalı",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "düşərgə",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Ayaq əyləci",
+ "alarmFuelLeak": "Yanacaq sızması",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Çıxarma",
+ "notificationType": "Xəbərdarlıq növü",
+ "notificationAlways": "Bütün Cihazlar",
+ "notificationNotificators": "Kanallar",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Marşrut",
+ "reportEvents": "Hadisələr",
+ "reportTrips": "Gedişlər",
+ "reportStops": "Dayanacaqlar",
+ "reportSummary": "Xülasə",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Diaqram",
+ "reportConfigure": "Konfiqurasiya etmək",
+ "reportEventTypes": "Hadisənin tipi",
+ "reportChartType": "Diaqram tipi",
+ "reportShowMarkers": "Markerləri göstərmək",
+ "reportExport": "Eksport",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Dövr",
+ "reportCustom": "Xüsusi",
+ "reportToday": "Bu gün",
+ "reportYesterday": "Dünən",
+ "reportThisWeek": "Bu həftə",
+ "reportPreviousWeek": "Əvvəlki həftə",
+ "reportThisMonth": "Bu ay",
+ "reportPreviousMonth": "Əvvəlki Ay",
+ "reportDeviceName": "Cihazın adı",
+ "reportAverageSpeed": "Orta sürət",
+ "reportMaximumSpeed": "Maksimal sürə",
+ "reportEngineHours": "Mühərrik saatları",
+ "reportDuration": "Davamiyyəti",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Başlanğıc vaxtı",
+ "reportStartAddress": "Başlanğıc ünvanı",
+ "reportEndTime": "Qurtarma vaxtı",
+ "reportEndAddress": "Qurtarma ünvanı",
+ "reportSpentFuel": "Yanacaq işləndi",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Statistika",
+ "statisticsCaptureTime": "Yığım vaxtı",
+ "statisticsActiveUsers": "Aktiv istifadəçilər",
+ "statisticsActiveDevices": "Aktiv cihazlar",
+ "statisticsRequests": "Sorğular",
+ "statisticsMessagesReceived": "İsmarıclar alındı",
+ "statisticsMessagesStored": "İsmarıclar yadda saxlanıldı",
+ "statisticsGeocoder": "Geokoder sorğuları",
+ "statisticsGeolocation": "Geolokasiya sorğuları",
+ "categoryArrow": "Ox",
+ "categoryDefault": "Default rejimi",
+ "categoryAnimal": "Heyvan",
+ "categoryBicycle": "Velosiped",
+ "categoryBoat": "Qayıq",
+ "categoryBus": "Avtobus",
+ "categoryCar": "Avtomobil",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Kran",
+ "categoryHelicopter": "Vertolyot",
+ "categoryMotorcycle": "Motosikl",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "İnsan",
+ "categoryPickup": "Pikap",
+ "categoryPlane": "Təyyarə",
+ "categoryShip": "Gəmi",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "qatar",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Yük maşını",
+ "categoryVan": "Furqon",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Başlamaq",
+ "maintenancePeriod": "Dövr"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/bg.json b/legacy/web/l10n/bg.json
new file mode 100644
index 00000000..299b7a15
--- /dev/null
+++ b/legacy/web/l10n/bg.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Зареждане...",
+ "sharedHide": "Скрий",
+ "sharedSave": "Запази",
+ "sharedUpload": "Upload",
+ "sharedSet": "Настрой",
+ "sharedCancel": "Отказ",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Добави",
+ "sharedEdit": "Редактирай",
+ "sharedRemove": "Премахни",
+ "sharedRemoveConfirm": "Потвърди премахването!",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "км",
+ "sharedMi": "мил",
+ "sharedNmi": "Морска миля",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "възел",
+ "sharedKmh": "км/ч",
+ "sharedMph": "мил/ч",
+ "sharedHour": "Час",
+ "sharedMinute": "Минута",
+ "sharedSecond": "Секунда",
+ "sharedDays": "дни",
+ "sharedHours": "часа",
+ "sharedMinutes": "мин.",
+ "sharedDecimalDegrees": "Градуси",
+ "sharedDegreesDecimalMinutes": "Градуси, минути",
+ "sharedDegreesMinutesSeconds": "Градуси, минути, секунди",
+ "sharedName": "Име",
+ "sharedDescription": "Описание",
+ "sharedSearch": "Търси",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Зона",
+ "sharedGeofences": "Зони",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Известия",
+ "sharedNotification": "Известиe",
+ "sharedAttributes": "Параметри",
+ "sharedAttribute": "Параметър",
+ "sharedDrivers": "Шофьори",
+ "sharedDriver": "Шофьор",
+ "sharedArea": "Район",
+ "sharedSound": "Тон на известията",
+ "sharedType": "Тип",
+ "sharedDistance": "Разстояние",
+ "sharedHourAbbreviation": "ч.",
+ "sharedMinuteAbbreviation": "мин.",
+ "sharedSecondAbbreviation": "сек.",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "лит.",
+ "sharedGallonAbbreviation": "гал.",
+ "sharedLiter": "Литър",
+ "sharedImpGallon": "Британски галон",
+ "sharedUsGallon": "Американски галон",
+ "sharedLiterPerHourAbbreviation": "л/ч",
+ "sharedGetMapState": "Състояние на картата",
+ "sharedComputedAttribute": "Изчислен параметър",
+ "sharedComputedAttributes": "Изчислени параметри",
+ "sharedCheckComputedAttribute": "Провери изчисления параметър",
+ "sharedExpression": "Израз",
+ "sharedDevice": "Устройство",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Изпрати пробно известие",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Календар",
+ "sharedCalendars": "Календари",
+ "sharedFile": "Архив",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Избери архив",
+ "sharedPhone": "Телефон",
+ "sharedRequired": "Задължително",
+ "sharedPreferences": "Предпочитания",
+ "sharedPermissions": "Разрешения",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Допълнително",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Условие",
+ "sharedTypeNumber": "Номер",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Часова зона",
+ "sharedInfoTitle": "Инфо",
+ "sharedSavedCommand": "Запазена команда",
+ "sharedSavedCommands": "Запазени команди",
+ "sharedNew": "Нова команда",
+ "sharedShowAddress": "Покажи адреса",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Блокиран",
+ "sharedMaintenance": "Обслужване",
+ "sharedDeviceAccumulators": "Акумулатор",
+ "sharedAlarms": "Аларми",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Ограничение на скоростта",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Дължина на линията",
+ "attributeReportIgnoreOdometer": "Отчет: Игнорирай километража",
+ "attributeWebReportColor": "Цвят на Отчета",
+ "attributeDevicePassword": "Парола на устройството",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Обработка: копиране на сензори",
+ "attributeColor": "Цвят",
+ "attributeWebLiveRouteLength": "Дължина на дирята",
+ "attributeWebSelectZoom": "Приближи избраното",
+ "attributeWebMaxZoom": "Максимално приближение",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Поща: SMTP хост",
+ "attributeMailSmtpPort": "Поща: SMTP порт",
+ "attributeMailSmtpStarttlsEnable": "Поща: SMTP STARTTLS активирай",
+ "attributeMailSmtpStarttlsRequired": "Поща: SMTP STARTTLS задължително",
+ "attributeMailSmtpSslEnable": "Поща: SMTP SSL активирай",
+ "attributeMailSmtpSslTrust": "Поща: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Поща: SMTP SSL протокол",
+ "attributeMailSmtpFrom": "Поща: SMTP от",
+ "attributeMailSmtpAuth": "Поща: SMTP Auth активирай",
+ "attributeMailSmtpUsername": "Поща: SMTP потребител",
+ "attributeMailSmtpPassword": "Поща: SMTP парола",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "Деактивирай Събития",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "Деактивирай Шофьори",
+ "attributeUiDisableComputedAttributes": "Деактивирай изчислените параметри",
+ "attributeUiDisableCalendars": "Деактивирай Календара",
+ "attributeUiDisableMaintenance": "Деактивирай Обслужване",
+ "attributeUiHidePositionAttributes": "Скрий атрибутите на позицията",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Грешка",
+ "errorGeneral": "Невалидни параметри",
+ "errorConnection": "Грешка във връзката",
+ "errorSocket": "Грешка в WebSocket връзката",
+ "errorZero": "Не може да бъде нула",
+ "userEmail": "Пощенска кутия",
+ "userPassword": "Парола",
+ "userAdmin": "Администратор",
+ "userRemember": "Запомни",
+ "userExpirationTime": "Изтичане",
+ "userDeviceLimit": "Макс. брой у-ва",
+ "userUserLimit": "Макс. брой потребители",
+ "userDeviceReadonly": "Заключи устройството",
+ "userLimitCommands": "Ограничи командите",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Жетон",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Вход",
+ "loginLanguage": "Език",
+ "loginReset": "Reset Password",
+ "loginRegister": "Регистрация",
+ "loginLogin": "Вход",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Грешен потребител или парола",
+ "loginCreated": "Регистриран нов потребител",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Изход",
+ "loginLogo": "Лого",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Устройства и състояние",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Обекти",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Идентификатор",
+ "deviceModel": "Модел",
+ "deviceContact": "Контакт",
+ "deviceCategory": "Категория",
+ "deviceLastUpdate": "Последно обновяване",
+ "deviceCommand": "Команда",
+ "deviceFollow": "Следвай",
+ "deviceTotalDistance": "Общ пробег",
+ "deviceStatus": "Статус",
+ "deviceStatusOnline": "На линия",
+ "deviceStatusOffline": "Няма връзка",
+ "deviceStatusUnknown": "Неизвестен",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Група",
+ "groupParent": "Група",
+ "groupNoGroup": "Без група",
+ "settingsTitle": "Настройки",
+ "settingsUser": "Профил",
+ "settingsGroups": "Групи",
+ "settingsServer": "Сървър",
+ "settingsUsers": "Потребители",
+ "settingsDistanceUnit": "Мерна единица за разстояние",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Мерна единица за скорост",
+ "settingsVolumeUnit": "Мерна единица за обем",
+ "settingsTwelveHourFormat": "12 часов формат",
+ "settingsCoordinateFormat": "Формат на координатите",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Отчети",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Устройство",
+ "reportGroup": "Група",
+ "reportFrom": "От",
+ "reportTo": "До",
+ "reportShow": "Покажи",
+ "reportClear": "Изчисти",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Валидност",
+ "positionAccuracy": "Точност",
+ "positionLatitude": "Географска Ширина",
+ "positionLongitude": "Географска Дължина",
+ "positionAltitude": "Надморска височина",
+ "positionSpeed": "Скорост",
+ "positionCourse": "Посока",
+ "positionAddress": "Адрес",
+ "positionProtocol": "Протокол",
+ "positionDistance": "Разстояние",
+ "positionRpm": "Обороти",
+ "positionFuel": "Гориво",
+ "positionPower": "Захранване",
+ "positionBattery": "Батерия",
+ "positionRaw": "Необработен",
+ "positionIndex": "Индекс",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Сателити",
+ "positionSatVisible": "Видими сателити",
+ "positionRssi": "GSM сигнал",
+ "positionGps": "ДжиПиЕс",
+ "positionRoaming": "Роуминг",
+ "positionEvent": "Събитие",
+ "positionAlarm": "Аларма",
+ "positionStatus": "Статус",
+ "positionOdometer": "Километраж",
+ "positionServiceOdometer": "Служебен километраж",
+ "positionTripOdometer": "Километраж пътуване",
+ "positionHours": "Часове",
+ "positionSteps": "Стъпки",
+ "positionInput": "Входни данни",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Изходящи данни",
+ "positionBatteryLevel": "Батерия %",
+ "positionFuelConsumption": "Разход на гориво",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Фърмуеър версия",
+ "positionVersionHw": "Версия на апаратурата",
+ "positionIgnition": "На контакт",
+ "positionFlags": "Флагове",
+ "positionCharge": "Зареждане",
+ "positionIp": "АйПи",
+ "positionArchive": "Архив",
+ "positionVin": "VIN",
+ "positionApproximate": "Приблизително",
+ "positionThrottle": "Газ",
+ "positionMotion": "В движение",
+ "positionArmed": "Активиран",
+ "positionAcceleration": "Ускорение",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Температура на устройството",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Оператор",
+ "positionCommand": "Команда",
+ "positionBlocked": "Блокиран",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD скорост",
+ "positionObdOdometer": "OBD километраж",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Идентификатор на шофьора",
+ "positionCard": "Card",
+ "positionImage": "Изображение",
+ "positionVideo": "Video",
+ "positionAudio": "Звук",
+ "serverTitle": "Настройки на сървъра",
+ "serverZoom": "Приближение",
+ "serverRegistration": "Регистрация",
+ "serverReadonly": "Ограничени права",
+ "serverForceSettings": "Наложи настройките",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Карта",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Карта",
+ "mapCustom": "По избор (XYZ)",
+ "mapCustomArcgis": "По избор (ArcGIS)",
+ "mapCustomLabel": "Потребителска карта",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Ключ за Bing Maps",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing карта хибрид",
+ "mapBaidu": "Байду",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex карта",
+ "mapYandexSat": "Yandex сателитна карта ",
+ "mapWikimedia": "Уикимедия",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Многоъгълник",
+ "mapShapeCircle": "Кръг",
+ "mapShapePolyline": "Линия",
+ "mapLiveRoutes": "Маршрут",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI слой",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Състояние",
+ "stateName": "Параметър",
+ "stateValue": "Стойност",
+ "commandTitle": "Команда",
+ "commandSend": "Изпрати",
+ "commandSent": "Командата изпратена",
+ "commandQueued": "Командата на изчакване",
+ "commandUnit": "Мерна ед.",
+ "commandCustom": "Персонализирана команда",
+ "commandDeviceIdentification": "Идентификатор на устройството",
+ "commandPositionSingle": "Единичен доклад",
+ "commandPositionPeriodic": "Периодичен доклад",
+ "commandPositionStop": "Спри доклада",
+ "commandEngineStop": "Спри двигателя",
+ "commandEngineResume": "Стартирай двигателя",
+ "commandAlarmArm": "Активирай Аларма",
+ "commandAlarmDisarm": "Деактивирай Аларма",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Задай часова зона",
+ "commandRequestPhoto": "Изискай снимка",
+ "commandPowerOff": "Изключи устройството",
+ "commandRebootDevice": "Рестартирай устройството",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Изпрати SMS",
+ "commandSendUssd": "Изпрати USSD",
+ "commandSosNumber": "Задай SOS номер",
+ "commandSilenceTime": "Задай \"Тих час\"",
+ "commandSetPhonebook": "Задай тел. указател",
+ "commandVoiceMessage": "Гласово съобщение",
+ "commandOutputControl": "Изходен контрол",
+ "commandVoiceMonitoring": "Гласово наблюдение",
+ "commandSetAgps": "Настрой AGPS",
+ "commandSetIndicator": "Настрой индикатор",
+ "commandConfiguration": "Конфигурация",
+ "commandGetVersion": "Получи версията",
+ "commandFirmwareUpdate": "Обнови фърмуеър",
+ "commandSetConnection": "Настрой връзката",
+ "commandSetOdometer": "Настрой километража",
+ "commandGetModemStatus": "Виж състоянието на модема",
+ "commandGetDeviceStatus": "Виж състоянието на устройството",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Честота",
+ "commandTimezone": "Компенсация на часовата зона",
+ "commandMessage": "Съобщение",
+ "commandRadius": "Радиус",
+ "commandEnable": "Активирай",
+ "commandData": "Данни",
+ "commandIndex": "Индекс",
+ "commandPhone": "Телефонен номер",
+ "commandServer": "Сървър",
+ "commandPort": "Порт",
+ "eventAll": "Всички събития",
+ "eventDeviceOnline": "Статус на линия",
+ "eventDeviceUnknown": "Статус неизвестен",
+ "eventDeviceOffline": "Статус без връзка",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Обектът в движение",
+ "eventDeviceStopped": "Обектът спря",
+ "eventDeviceOverspeed": "Ограничението на скоростта превишено",
+ "eventDeviceFuelDrop": "Спад на горивото",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Резултат от командата",
+ "eventGeofenceEnter": "Влизане в зона",
+ "eventGeofenceExit": "Излизане от зона",
+ "eventAlarm": "Аларма",
+ "eventIgnitionOn": "Запалването включено",
+ "eventIgnitionOff": "Запалването изключено",
+ "eventMaintenance": "Необходимо е обслужване",
+ "eventTextMessage": "Получен SMS",
+ "eventDriverChanged": "Шофьорът се смени",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Отиди на последния",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Общи",
+ "alarmSos": "SOS",
+ "alarmVibration": "Вибрация",
+ "alarmMovement": "Движение",
+ "alarmLowspeed": "Ниска скорост",
+ "alarmOverspeed": "Превишена скорост",
+ "alarmFallDown": "Падане",
+ "alarmLowPower": "Ниска мощност",
+ "alarmLowBattery": "Слаба батерия",
+ "alarmFault": "Повреда",
+ "alarmPowerOff": "Захранването изключено",
+ "alarmPowerOn": "Захранването включено",
+ "alarmDoor": "Врата",
+ "alarmLock": "Заключи",
+ "alarmUnlock": "Отключи",
+ "alarmGeofence": "Зона",
+ "alarmGeofenceEnter": "Влизане в зона",
+ "alarmGeofenceExit": "Излизане от зона",
+ "alarmGpsAntennaCut": "GPS антената откачена",
+ "alarmAccident": "Инцидент",
+ "alarmTow": "Дърпане",
+ "alarmIdle": "В покой",
+ "alarmHighRpm": "Високи обороти",
+ "alarmHardAcceleration": "Рязко ускорение",
+ "alarmHardBraking": "Рязко спиране",
+ "alarmHardCornering": "Рязко завиване",
+ "alarmLaneChange": "Смяна на лентите",
+ "alarmFatigueDriving": "Уморен водач",
+ "alarmPowerCut": "Захранването прекъснато",
+ "alarmPowerRestored": "Захранването възстановено",
+ "alarmJamming": "Заглушаване",
+ "alarmTemperature": "Температура",
+ "alarmParking": "Паркиране",
+ "alarmBonnet": "Капак",
+ "alarmFootBrake": "Спирачен педал",
+ "alarmFuelLeak": "Теч на гориво",
+ "alarmTampering": "Намеса ",
+ "alarmRemoving": "Премахване",
+ "notificationType": "Тип на известието",
+ "notificationAlways": "Всички устройства",
+ "notificationNotificators": "Канали",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Интернет",
+ "notificatorMail": "Поща",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Маршрут",
+ "reportEvents": "Събития",
+ "reportTrips": "Пътувания",
+ "reportStops": "Престой",
+ "reportSummary": "Общо",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Графика",
+ "reportConfigure": "Конфигуриране",
+ "reportEventTypes": "Тип събития",
+ "reportChartType": "Тип на графиката",
+ "reportShowMarkers": "Покажи маркери",
+ "reportExport": "Експорт",
+ "reportEmail": "Имейл отчет",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Период",
+ "reportCustom": "По избор",
+ "reportToday": "Днес",
+ "reportYesterday": "Вчера",
+ "reportThisWeek": "Тази седмица",
+ "reportPreviousWeek": "Предната седмица",
+ "reportThisMonth": "Този месец",
+ "reportPreviousMonth": "Предният месец",
+ "reportDeviceName": "Име на обект",
+ "reportAverageSpeed": "Средна скорост",
+ "reportMaximumSpeed": "Максимална скорост",
+ "reportEngineHours": "Машиночас",
+ "reportDuration": "Продължителност",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Начален час",
+ "reportStartAddress": "Начален адрес",
+ "reportEndTime": "Краен час",
+ "reportEndAddress": "Краен адрес",
+ "reportSpentFuel": "Изразходвано гориво",
+ "reportStartOdometer": "Одометър Старт",
+ "reportEndOdometer": "Одометър Стоп",
+ "statisticsTitle": "Статистики",
+ "statisticsCaptureTime": "Дата",
+ "statisticsActiveUsers": "Активни потребители",
+ "statisticsActiveDevices": "Активни устройства",
+ "statisticsRequests": "Повиквания",
+ "statisticsMessagesReceived": "Приети съобщения",
+ "statisticsMessagesStored": "Запазени съобщения",
+ "statisticsGeocoder": "Запитвания за адрес",
+ "statisticsGeolocation": "Запитвания за позиция",
+ "categoryArrow": "Стрелка",
+ "categoryDefault": "По подразбиране",
+ "categoryAnimal": "Животно",
+ "categoryBicycle": "Колело",
+ "categoryBoat": "Лодка",
+ "categoryBus": "Автобус",
+ "categoryCar": "Кола",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Кран",
+ "categoryHelicopter": "Въртолет",
+ "categoryMotorcycle": "Мотор",
+ "categoryOffroad": "Джип",
+ "categoryPerson": "Човек",
+ "categoryPickup": "Пикап",
+ "categoryPlane": "Самолет",
+ "categoryShip": "Кораб",
+ "categoryTractor": "Трактор",
+ "categoryTrain": "Влак",
+ "categoryTram": "Трамвай",
+ "categoryTrolleybus": "Тролейбус",
+ "categoryTruck": "Камион",
+ "categoryVan": "Ван",
+ "categoryScooter": "Скутер",
+ "maintenanceStart": "Старт",
+ "maintenancePeriod": "Период"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/bn.json b/legacy/web/l10n/bn.json
new file mode 100644
index 00000000..79d6c3d0
--- /dev/null
+++ b/legacy/web/l10n/bn.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "লোড হচ্ছে ...",
+ "sharedHide": "লুকিয়ে রাখুন",
+ "sharedSave": " সংরক্ষণ করুন",
+ "sharedUpload": "Upload",
+ "sharedSet": "স্থাপন করুন",
+ "sharedCancel": " বাতিল করুন",
+ "sharedCopy": "Copy",
+ "sharedAdd": "যুক্ত করুন",
+ "sharedEdit": "সম্পাদন করুন",
+ "sharedRemove": "অপসারণ করুন",
+ "sharedRemoveConfirm": "আইটেম অপসারণ?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "কিমি",
+ "sharedMi": "মাইল",
+ "sharedNmi": "নটিক্যাল মাইল",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "কিলোনটিক্যাল",
+ "sharedKmh": "কিমি / ঘঃ",
+ "sharedMph": "mph",
+ "sharedHour": "ঘন্টা",
+ "sharedMinute": "মিনিট",
+ "sharedSecond": "সেকেন্ড",
+ "sharedDays": "দিন",
+ "sharedHours": "ঘন্টা",
+ "sharedMinutes": "মিনিট",
+ "sharedDecimalDegrees": "দশমিক ডিগ্রী",
+ "sharedDegreesDecimalMinutes": "ডিগ্রি দশমিক মিনিট",
+ "sharedDegreesMinutesSeconds": "ডিগ্রি মিনিট সেকেন্ড",
+ "sharedName": "নাম",
+ "sharedDescription": "বিবরণ / বর্ণনা",
+ "sharedSearch": "অনুসন্ধান / খোঁজা",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "জিওফেন্স / ভৌগোলিক বেষ্টনী",
+ "sharedGeofences": "জিওফেন্স / ভৌগোলিক বেষ্টনী",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "অধিসূচনা সামুহ",
+ "sharedNotification": "অধিসূচনা",
+ "sharedAttributes": "বৈশিষ্ট্যাবলী / গুণাবলী",
+ "sharedAttribute": "বৈশিষ্ট্যাবলী / গুণাবলী",
+ "sharedDrivers": "চালক সমুহ",
+ "sharedDriver": "চালক",
+ "sharedArea": "এলাকা",
+ "sharedSound": "অধিসূচনা শব্দ",
+ "sharedType": "ধরন",
+ "sharedDistance": "দূরত্ব",
+ "sharedHourAbbreviation": "ঘ",
+ "sharedMinuteAbbreviation": "মি",
+ "sharedSecondAbbreviation": "সে",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "গ্যালন",
+ "sharedLiter": "লিটার",
+ "sharedImpGallon": "ইম্পেরিয়াল গ্যালন",
+ "sharedUsGallon": "আমেরিকি গ্যালন",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "মানচিত্রের অবস্থা",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "অভিব্যক্তি",
+ "sharedDevice": "ডিভাইস",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send Test Notification",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "পঞ্জিকা",
+ "sharedCalendars": "পঞ্জিকাগুলি",
+ "sharedFile": "File",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Select File",
+ "sharedPhone": "ফোন",
+ "sharedRequired": "অবশ্যক",
+ "sharedPreferences": "পছন্দসমূহ",
+ "sharedPermissions": "অনুমতিসমূহ",
+ "sharedConnections": "Connections",
+ "sharedExtra": "অতিরিক্ত",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "স্ট্রিং",
+ "sharedTypeNumber": "নম্বর",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "টাইমজোন",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "ঠিকানা দেখান",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "ডিভাইসের গতি সীমা",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Report: Ignore Odometer",
+ "attributeWebReportColor": "ওয়েব: রিপোর্টের রঙ",
+ "attributeDevicePassword": "ডিভাইস পাসওয়ার্ড",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "রং",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "ত্রুটি",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "সংযোগ ত্রুটি",
+ "errorSocket": "ওয়েব সকেট সংযোগ ত্রুটি",
+ "errorZero": "Can't be zero",
+ "userEmail": "ইমেইল",
+ "userPassword": "পাসওয়ার্ড",
+ "userAdmin": "অ্যাডমিন",
+ "userRemember": "মনে রাখো",
+ "userExpirationTime": "Expiration",
+ "userDeviceLimit": "ডিভাইসের গতি সীমা",
+ "userUserLimit": "ব্যবহারকারীর সীমা",
+ "userDeviceReadonly": "ডিভাইস রিড অনলি",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "টোকেন",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "লগইন",
+ "loginLanguage": "ভাষা",
+ "loginReset": "Reset Password",
+ "loginRegister": "নিবন্ধন",
+ "loginLogin": "লগইন",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "ভুল ইমেল এড্রেস বা পাসওয়ার্ড",
+ "loginCreated": "নতুন ব্যবহারকারী নিবন্ধিত হয়েছে",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "লগ আউট",
+ "loginLogo": "লোগো",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "ডিভাইস ও অবস্থা",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "ডিভাইস",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifier",
+ "deviceModel": "মডেল",
+ "deviceContact": "যোগাযোগ",
+ "deviceCategory": "বিভাগ",
+ "deviceLastUpdate": "সর্বশেষ আপডেট",
+ "deviceCommand": "কমান্ড",
+ "deviceFollow": "Follow",
+ "deviceTotalDistance": "সম্পুর্ণ দুরত্ব",
+ "deviceStatus": "অবস্থা",
+ "deviceStatusOnline": "অনলাইন",
+ "deviceStatusOffline": "অফলাইন",
+ "deviceStatusUnknown": "অজানা",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "গ্রুপ",
+ "groupParent": "গ্রুপ",
+ "groupNoGroup": "No Group",
+ "settingsTitle": "সেটিংস",
+ "settingsUser": "অ্যাকাউন্ট",
+ "settingsGroups": "Groups",
+ "settingsServer": "সার্ভার",
+ "settingsUsers": "Users",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "12-hour Format",
+ "settingsCoordinateFormat": "Coordinates Format",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Reports",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "ডিভাইস",
+ "reportGroup": "গ্রুপ",
+ "reportFrom": "From",
+ "reportTo": "To",
+ "reportShow": "দেখাও",
+ "reportClear": "পরিষ্কার",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Valid",
+ "positionAccuracy": "সঠিকতা",
+ "positionLatitude": "অক্ষাংশ",
+ "positionLongitude": "দ্রাঘিমাংশ",
+ "positionAltitude": "উচ্চতা",
+ "positionSpeed": "গতি",
+ "positionCourse": "Course",
+ "positionAddress": "ঠিকানা",
+ "positionProtocol": "প্রোটোকল",
+ "positionDistance": "দূরত্ব",
+ "positionRpm": "RPM",
+ "positionFuel": "জ্বালানি",
+ "positionPower": "Power",
+ "positionBattery": "ব্যাটারি",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS/জিপিএস",
+ "positionRoaming": "Roaming",
+ "positionEvent": "ঘটনা",
+ "positionAlarm": "অ্যালার্ম / সংকেত",
+ "positionStatus": "অবস্থা",
+ "positionOdometer": "ওডোমিটার",
+ "positionServiceOdometer": "সার্ভিস ওডোমিটার",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "ঘন্টা",
+ "positionSteps": "Steps",
+ "positionInput": "ইনপুট",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "আউটপুট",
+ "positionBatteryLevel": "ব্যাটারি স্তর",
+ "positionFuelConsumption": "জ্বালানি খরচ",
+ "positionRfid": "RFID",
+ "positionVersionFw": "ফার্মওয়্যার সংস্করণ",
+ "positionVersionHw": "হার্ডওয়্যার সংস্করণ",
+ "positionIgnition": "ইগনিশন",
+ "positionFlags": "Flags",
+ "positionCharge": "চার্জ",
+ "positionIp": "IP",
+ "positionArchive": "আর্কাইভ / সংরক্ষাণাগার",
+ "positionVin": "VIN",
+ "positionApproximate": "আনুমানিক",
+ "positionThrottle": "থ্রটল / নির্গমন নিয়ন্ত্রণ",
+ "positionMotion": "গতি",
+ "positionArmed": "রক্ষিত করা",
+ "positionAcceleration": "ত্বরণ",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "ডিভাইসের তাপমাত্রা",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "কমান্ড",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "সার্ভার সেটিংস ",
+ "serverZoom": "জুম্",
+ "serverRegistration": "নিবন্ধন",
+ "serverReadonly": "রিড অনলি",
+ "serverForceSettings": "ফোর্স সেটিংস",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "মানচিত্র",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "মানচিত্র স্তর",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "বহুভুজ",
+ "mapShapeCircle": "বৃত্ত / বৃত্তাকার",
+ "mapShapePolyline": "পলিলাইন",
+ "mapLiveRoutes": "Live Routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "State",
+ "stateName": "বৈশিষ্ট্যাবলী / গুণাবলী",
+ "stateValue": "মান",
+ "commandTitle": "কমান্ড",
+ "commandSend": "পাঠান",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "ইউনিট",
+ "commandCustom": "Custom command",
+ "commandDeviceIdentification": "ডিভাইস সনাক্তকরণ",
+ "commandPositionSingle": "একক রিপোর্টিং",
+ "commandPositionPeriodic": "পর্যায়ক্রমিক রিপোর্ট",
+ "commandPositionStop": "রিপোর্টিং বন্ধ করা",
+ "commandEngineStop": "ইঞ্জিন বন্ধ",
+ "commandEngineResume": "ইঞ্জিন পুনরায় চালু করুন",
+ "commandAlarmArm": "রক্ষিত করার অ্যালার্ম / সংকেত",
+ "commandAlarmDisarm": "অরক্ষিত করার অ্যালার্ম / সংকেত",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "টাইমজোন সেট করুন",
+ "commandRequestPhoto": "Request Photo",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "রিবুট ডিভাইস",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Send SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "Set SOS Number",
+ "commandSilenceTime": "Set Silence Time",
+ "commandSetPhonebook": "Set Phonebook",
+ "commandVoiceMessage": "ভয়েস বার্তা",
+ "commandOutputControl": "Output Control",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Set Indicator",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "ফ্রিকোয়েন্সি",
+ "commandTimezone": "Timezone Offset",
+ "commandMessage": "বার্তা",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "উপাত্ত / ডেটা",
+ "commandIndex": "Index",
+ "commandPhone": "ফোন নম্বর",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "সকল ঘটনা",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Command result",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "রক্ষণাবেক্ষণ প্রয়োজন",
+ "eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Type of Notification",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Route",
+ "reportEvents": "Events",
+ "reportTrips": "Trips",
+ "reportStops": "Stops",
+ "reportSummary": "Summary",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Chart",
+ "reportConfigure": "কনফিগার",
+ "reportEventTypes": "Event Types",
+ "reportChartType": "Chart Type",
+ "reportShowMarkers": "মার্কার দেখাও",
+ "reportExport": "Export",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "ডিভাইসের নাম",
+ "reportAverageSpeed": "Average Speed",
+ "reportMaximumSpeed": "Maximum Speed",
+ "reportEngineHours": "Engine Hours",
+ "reportDuration": "Duration",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "শুরুর সময় ",
+ "reportStartAddress": "শুরুর ঠিকানা",
+ "reportEndTime": "শেষ সময়",
+ "reportEndAddress": "শেষ ঠিকানা",
+ "reportSpentFuel": "ব্যয়িত জ্বালানি",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "পরিসংখ্যান",
+ "statisticsCaptureTime": "সময় ক্যাপচার",
+ "statisticsActiveUsers": "সক্রিয় ব্যবহারকারীগণ",
+ "statisticsActiveDevices": "সক্রিয় ডিভাইস",
+ "statisticsRequests": "রিকোয়েস্টসমূহ",
+ "statisticsMessagesReceived": "Messages Received",
+ "statisticsMessagesStored": "Messages Stored",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "তীর",
+ "categoryDefault": "ডিফল্ট",
+ "categoryAnimal": "পশু",
+ "categoryBicycle": "সাইকেল",
+ "categoryBoat": "নৌকা",
+ "categoryBus": "বাস",
+ "categoryCar": "কার",
+ "categoryCamper": "Camper",
+ "categoryCrane": "ক্রেন",
+ "categoryHelicopter": "হেলিকপ্টার",
+ "categoryMotorcycle": "মোটরসাইকেল",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "ব্যক্তি",
+ "categoryPickup": "পিকআপ",
+ "categoryPlane": "প্লেন",
+ "categoryShip": "জাহাজ",
+ "categoryTractor": "ট্র্যাক্টর",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "ট্রাক",
+ "categoryVan": "ভ্যান",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ca.json b/legacy/web/l10n/ca.json
new file mode 100644
index 00000000..6ac0b872
--- /dev/null
+++ b/legacy/web/l10n/ca.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Carregant…",
+ "sharedHide": "Ocultar",
+ "sharedSave": "Guardar",
+ "sharedUpload": "Carrega",
+ "sharedSet": "Establir",
+ "sharedCancel": "Cancel·lar",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Afegir",
+ "sharedEdit": "Editar",
+ "sharedRemove": "Eliminar",
+ "sharedRemoveConfirm": "Eliminar element?",
+ "sharedNoData": "Sense dades",
+ "sharedSubject": "Subject",
+ "sharedYes": "Sí",
+ "sharedNo": "No",
+ "sharedKm": "Km",
+ "sharedMi": "MI",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "Nusos",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Hora",
+ "sharedMinute": "Minut",
+ "sharedSecond": "Segon",
+ "sharedDays": "Dies",
+ "sharedHours": "Hores",
+ "sharedMinutes": "minuts",
+ "sharedDecimalDegrees": "Graus amb decimals",
+ "sharedDegreesDecimalMinutes": "Graus i Minuts amb decimals",
+ "sharedDegreesMinutesSeconds": "Graus Minuts i Segons",
+ "sharedName": "Nom",
+ "sharedDescription": "Descripció",
+ "sharedSearch": "Cercar",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geo-Zona",
+ "sharedGeofences": "Geo-Zones",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Notificacions",
+ "sharedNotification": "Notificació",
+ "sharedAttributes": "Atributs",
+ "sharedAttribute": "Atribut",
+ "sharedDrivers": "Conductors",
+ "sharedDriver": "Conductor",
+ "sharedArea": "Àrea",
+ "sharedSound": "So de notificació",
+ "sharedType": "Tipus",
+ "sharedDistance": "Distància",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "g",
+ "sharedLiter": "Litre",
+ "sharedImpGallon": "Galó Imp.",
+ "sharedUsGallon": "Galó U.S.",
+ "sharedLiterPerHourAbbreviation": "L/h",
+ "sharedGetMapState": "Obtenir Estat del Mapa",
+ "sharedComputedAttribute": "Atribut calculat",
+ "sharedComputedAttributes": "Atributs calculats",
+ "sharedCheckComputedAttribute": "Revisar atribut calculat",
+ "sharedExpression": "Expressió",
+ "sharedDevice": "Dispositiu",
+ "sharedTest": "Prova",
+ "sharedTestNotification": "Enviar notificació de prova",
+ "sharedTestNotificators": "Canals de prova",
+ "sharedTestExpression": "Prova d'\\expressió",
+ "sharedCalendar": "Calendari",
+ "sharedCalendars": "Calendaris",
+ "sharedFile": "Arxiu",
+ "sharedSearchDevices": "Buscar Dispositius",
+ "sharedSortBy": "Ordenar per",
+ "sharedFilterMap": "Filtrar en el Mapa",
+ "sharedSelectFile": "Seleccioni arxiu",
+ "sharedPhone": "Telèfon",
+ "sharedRequired": "Obligatori",
+ "sharedPreferences": "Preferències",
+ "sharedPermissions": "Permisos",
+ "sharedConnections": "Connexions",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primari",
+ "sharedSecondary": "Secondari",
+ "sharedTypeString": "Cadena",
+ "sharedTypeNumber": "Número",
+ "sharedTypeBoolean": "Booleà",
+ "sharedTimezone": "Zona Horària",
+ "sharedInfoTitle": "Informació",
+ "sharedSavedCommand": "Comanda guardada",
+ "sharedSavedCommands": "Comandes guardades",
+ "sharedNew": "Nou…",
+ "sharedShowAddress": "Mostrar carrer",
+ "sharedShowDetails": "Més detalls",
+ "sharedDisabled": "Deshabilitat",
+ "sharedMaintenance": "Manteniments",
+ "sharedDeviceAccumulators": "Acumulador",
+ "sharedAlarms": "Alarmes",
+ "sharedLocation": "Ubicació",
+ "sharedImport": "Importar",
+ "sharedColumns": "Columnes",
+ "sharedDropzoneText": "Arrossegueu i deixeu anar un fitxer aquí o feu clic",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrència",
+ "calendarOnce": "Una vegada",
+ "calendarDaily": "Diari",
+ "calendarWeekly": "Setmanal",
+ "calendarMonthly": "Mensual",
+ "calendarDays": "Dies",
+ "calendarSunday": "Diumenge",
+ "calendarMonday": "Dilluns",
+ "calendarTuesday": "Dimarts",
+ "calendarWednesday": "Dimecres",
+ "calendarThursday": "Dijous",
+ "calendarFriday": "Divendres",
+ "calendarSaturday": "Dissabte",
+ "attributeShowGeofences": "Mostra tanques geogràfiques",
+ "attributeSpeedLimit": "Límit de velocitat",
+ "attributeFuelDropThreshold": "Llindar de caiguda de combustible",
+ "attributeFuelIncreaseThreshold": "Llindar d\\\\'augment del combustible",
+ "attributePolylineDistance": "Distància de polilínea",
+ "attributeReportIgnoreOdometer": "Informe: Ignorar el odòmetre",
+ "attributeWebReportColor": "Web: Color de l\\'informe",
+ "attributeDevicePassword": "Contrasenya de dispositiu",
+ "attributeDeviceImage": "Imatge del dispositiu",
+ "attributeDeviceInactivityStart": "Inici d\\'inactivitat del dispositiu",
+ "attributeDeviceInactivityPeriod": "Període de inactivitat del dispositiu",
+ "attributeProcessingCopyAttributes": "Processant: Còpia dels atributs",
+ "attributeColor": "Color",
+ "attributeWebLiveRouteLength": "Web: Longitud de la ruta en directe",
+ "attributeWebSelectZoom": "Web: fer zoom al seleccionar",
+ "attributeWebMaxZoom": "Web: Zoom màxim",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Correu: Servidor SMTP",
+ "attributeMailSmtpPort": "Correu: Port SMTP",
+ "attributeMailSmtpStarttlsEnable": "Correu: Habilitar SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "Correu: SMTP STARTTLS requerit",
+ "attributeMailSmtpSslEnable": "Correu: Habilitar SMTP SSL",
+ "attributeMailSmtpSslTrust": "Correu: SMTP SSL de confiança",
+ "attributeMailSmtpSslProtocols": "Correu: SMTP SSL protocols",
+ "attributeMailSmtpFrom": "Correu: SMTP desde",
+ "attributeMailSmtpAuth": "Correu: Habilitar autenticació SMTP",
+ "attributeMailSmtpUsername": "Correu: Nom d\\'usuari SMTP",
+ "attributeMailSmtpPassword": "Correu: Contrasenya SMTP",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Deshabilitar Grups",
+ "attributeUiDisableEvents": "UI: Deshabilitar esdeveniments",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Deshabilitar Conductors",
+ "attributeUiDisableComputedAttributes": "UI: Deshabilitar Atributs calculats",
+ "attributeUiDisableCalendars": "UI: Deshabilitar Calendari",
+ "attributeUiDisableMaintenance": "UI: Deshabilitar Manteniment",
+ "attributeUiHidePositionAttributes": "UI: Ocultar Atributs de Posició",
+ "attributeUiDisableLoginLanguage": "UI: Deshabilitar Idioma de inici de sessió",
+ "attributeNotificationTokens": "Notificació Tokens",
+ "attributePopupInfo": "Informació emergent",
+ "errorTitle": "Error",
+ "errorGeneral": "Paràmetres no vàlids o fora dels límits",
+ "errorConnection": "Error en la connexió",
+ "errorSocket": "Error del Web-Socket",
+ "errorZero": "No pot ser zero",
+ "userEmail": "Email",
+ "userPassword": "Contrasenya",
+ "userAdmin": "Administrador",
+ "userRemember": "Recordar",
+ "userExpirationTime": "Caducitat",
+ "userDeviceLimit": "Límit de dispositius",
+ "userUserLimit": "Límit d\\'usuaris",
+ "userDeviceReadonly": "Dispositiu de sòls lectura",
+ "userLimitCommands": "Limitar Comandes",
+ "userDisableReports": "Deshabilitar Informes",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token Accés",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Iniciar sessió",
+ "loginLanguage": "Idioma",
+ "loginReset": "Reiniciar contrasenya",
+ "loginRegister": "Registrar-se",
+ "loginLogin": "Iniciar sessió",
+ "loginOpenId": "Inicieu sessió amb OpenID",
+ "loginFailed": "Email o contrasenya incorrecta",
+ "loginCreated": "S'ha registrat un usuari nou",
+ "loginResetSuccess": "Comprova el teu email",
+ "loginUpdateSuccess": "S'ha creat la nova contrasenya",
+ "loginLogout": "Tancar Sessió",
+ "loginLogo": "Logotipus",
+ "loginTotpCode": "Codi de contrasenya d'un sol ús",
+ "loginTotpKey": "Una clau de contrasenya d'un sol ús",
+ "devicesAndState": "Dispositius i Estat",
+ "deviceSelected": "Dispositiu seleccionat",
+ "deviceTitle": "Dispositius",
+ "devicePrimaryInfo": "Títol del dispositiu",
+ "deviceSecondaryInfo": "Detall del dispositiu",
+ "deviceIdentifier": "Identificador",
+ "deviceModel": "Model",
+ "deviceContact": "Contacte",
+ "deviceCategory": "Categoria",
+ "deviceLastUpdate": "Última Actualització",
+ "deviceCommand": "Comanda",
+ "deviceFollow": "Seguir",
+ "deviceTotalDistance": "Distància Total",
+ "deviceStatus": "Estat",
+ "deviceStatusOnline": "En línia",
+ "deviceStatusOffline": "Fora de línia",
+ "deviceStatusUnknown": "Desconegut",
+ "deviceRegisterFirst": "Registreu el vostre primer dispositiu",
+ "deviceIdentifierHelp": "IMEI, número de sèrie o un altre identificador. Ha de fer coincidir els informes del dispositiu identificador amb el servidor.",
+ "deviceShare": "Compartir dispositiu",
+ "groupDialog": "Grup",
+ "groupParent": "Grup",
+ "groupNoGroup": "Sense grup",
+ "settingsTitle": "Preferències",
+ "settingsUser": "Compte",
+ "settingsGroups": "Grups",
+ "settingsServer": "Servidor",
+ "settingsUsers": "Usuaris",
+ "settingsDistanceUnit": "Unitat de Distància",
+ "settingsAltitudeUnit": "Unitat d\\'Altitud",
+ "settingsSpeedUnit": "Unitat de Velocitat",
+ "settingsVolumeUnit": "Unitat de Volum",
+ "settingsTwelveHourFormat": "Format de 12h.",
+ "settingsCoordinateFormat": "Format de Coordenades",
+ "settingsServerVersion": "Versió del servidor",
+ "settingsAppVersion": "Versió de l'App",
+ "settingsConnection": "Connexió",
+ "settingsDarkMode": "Mode Fosc",
+ "settingsTotpEnable": "Habilita la contrasenya d'un sol ús",
+ "settingsTotpForce": "Força contrasenya d'un sol ús",
+ "settingsServiceWorkerUpdateInterval": "Interval d'actualització del ServiceWorker",
+ "settingsUpdateAvailable": "Hi ha una actualització disponible.",
+ "settingsSupport": "Support",
+ "reportTitle": "Informes",
+ "reportScheduled": "Informes programats",
+ "reportDevice": "Dispositius",
+ "reportGroup": "Grup",
+ "reportFrom": "Desde",
+ "reportTo": "Fins",
+ "reportShow": "Mostrar",
+ "reportClear": "Netejar",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Hora registrada",
+ "positionDeviceTime": "Hora del Dispositiu",
+ "positionServerTime": "Hora del Servidor",
+ "positionValid": "Vàlida",
+ "positionAccuracy": "Precisió",
+ "positionLatitude": "Latitud",
+ "positionLongitude": "Longitud",
+ "positionAltitude": "Altitud",
+ "positionSpeed": "Velocitat",
+ "positionCourse": "Rumb",
+ "positionAddress": "Adreça",
+ "positionProtocol": "Protocol",
+ "positionDistance": "Distància",
+ "positionRpm": "RPM",
+ "positionFuel": "Combustible",
+ "positionPower": "Energia",
+ "positionBattery": "Bateria",
+ "positionRaw": "Cru",
+ "positionIndex": "Índex",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satèl·lits",
+ "positionSatVisible": "Satèl·lits Visibles",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Esdeveniment",
+ "positionAlarm": "Alarma",
+ "positionStatus": "Estat",
+ "positionOdometer": "Odòmetre",
+ "positionServiceOdometer": "Odòmetre de manteniment",
+ "positionTripOdometer": "Odòmetre de viatge",
+ "positionHours": "Hores",
+ "positionSteps": "Passos",
+ "positionInput": "Entrada",
+ "positionHeartRate": "Freqüència cardíaca",
+ "positionOutput": "Sortida",
+ "positionBatteryLevel": "Nivell de bateria",
+ "positionFuelConsumption": "Consum de combustible",
+ "positionRfid": "RFDI",
+ "positionVersionFw": "Versió del firmware",
+ "positionVersionHw": "Versió del hardware",
+ "positionIgnition": "Encès",
+ "positionFlags": "Banderes",
+ "positionCharge": "Càrrega",
+ "positionIp": "IP",
+ "positionArchive": "Arxiu",
+ "positionVin": "VIN",
+ "positionApproximate": "Aproximat",
+ "positionThrottle": "Accelerador",
+ "positionMotion": "Moviment",
+ "positionArmed": "Armat",
+ "positionAcceleration": "Acceleració",
+ "positionTemp": "Temperatura",
+ "positionDeviceTemp": "Temperatura del dispositiu",
+ "positionCoolantTemp": "Temperatura del refrigerant",
+ "positionOperator": "Operador",
+ "positionCommand": "Comanda",
+ "positionBlocked": "Blocat",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Velocitat OBD",
+ "positionObdOdometer": "Odòmetre OBD",
+ "positionDrivingTime": "Temps de conducció",
+ "positionDriverUniqueId": "ID única del conductor",
+ "positionCard": "Targeta",
+ "positionImage": "Imatge",
+ "positionVideo": "Video",
+ "positionAudio": "Àudio",
+ "serverTitle": "Paràmetres del servidor",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registre",
+ "serverReadonly": "Sòls lectura",
+ "serverForceSettings": "Forçar aquests paràmetres",
+ "serverAnnouncement": "Mostrar anunci",
+ "serverName": "Nom del servidor",
+ "serverDescription": "Descripció del servidor",
+ "serverColorPrimary": "Color Primari",
+ "serverColorSecondary": "Color Secundari",
+ "serverLogo": "Imatge del logotip",
+ "serverLogoInverted": "Imatge de logotip invertida",
+ "serverChangeDisable": "Desactiva el canvi de servidor",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Mapa",
+ "mapActive": "Mapes actius",
+ "mapOverlay": "Capa sobre el mapa",
+ "mapOverlayCustom": "Capa personalitzada",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Capes del Mapa",
+ "mapCustom": "Personalitzat (XYZ)",
+ "mapCustomArcgis": "Personalitzat (ArcGIS)",
+ "mapCustomLabel": "Mapa Personalitzat",
+ "mapCarto": "Carto",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Clau Bing Maps",
+ "mapBingRoad": "Bing Maps - Carretera",
+ "mapBingAerial": "Bing Maps - Aèro",
+ "mapBingHybrid": "Bing Maps - Híbrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex",
+ "mapYandexSat": "Yandex Satèl·lite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Fosc",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polígon",
+ "mapShapeCircle": "Cercle",
+ "mapShapePolyline": "Polilínia",
+ "mapLiveRoutes": "Rutes en Directe",
+ "mapDirection": "Mostra la direcció",
+ "mapCurrentLocation": "Ubicació Actual",
+ "mapPoiLayer": "Capa POI",
+ "mapClustering": "Agrupar Marcadors",
+ "mapOnSelect": "Mostrar Mapes en la selecció",
+ "mapDefault": "Mapa per defecte",
+ "stateTitle": "Estat",
+ "stateName": "Paràmetre",
+ "stateValue": "Valor",
+ "commandTitle": "Comanda",
+ "commandSend": "Enviar",
+ "commandSent": "Comanda enviat",
+ "commandQueued": "Comanda en cua",
+ "commandUnit": "Unitat",
+ "commandCustom": "Comanda personalitzada",
+ "commandDeviceIdentification": "Identificació al Dispositiu",
+ "commandPositionSingle": "Informe Únic",
+ "commandPositionPeriodic": "Informe Periòdic",
+ "commandPositionStop": "Aturar informe",
+ "commandEngineStop": "Apagar motor",
+ "commandEngineResume": "Desblocar Encès de Motor",
+ "commandAlarmArm": "Armar Alarma",
+ "commandAlarmDisarm": "Desarmar Alarma",
+ "commandAlarmDismiss": "Descartar Alarma",
+ "commandSetTimezone": "Establir Zona Horària",
+ "commandRequestPhoto": "Sol·licitar Foto",
+ "commandPowerOff": "Apagar dispositiu",
+ "commandRebootDevice": "Reiniciar dispositiu",
+ "commandFactoryReset": "Valors de fàbrica",
+ "commandSendSms": "Enviar SMS",
+ "commandSendUssd": "Enviar USSD",
+ "commandSosNumber": "Establir el número SOS",
+ "commandSilenceTime": "Establir horari de silenci",
+ "commandSetPhonebook": "Establir contacte",
+ "commandVoiceMessage": "Missatge de veu",
+ "commandOutputControl": "Control de Sortides",
+ "commandVoiceMonitoring": "Monitoratge de Veu",
+ "commandSetAgps": "Establir AGPS",
+ "commandSetIndicator": "Establir indicador",
+ "commandConfiguration": "Configuració",
+ "commandGetVersion": "Obtenir Versió",
+ "commandFirmwareUpdate": "Actualitzar Firmware",
+ "commandSetConnection": "Establir Connexió",
+ "commandSetOdometer": "Establir Odòmetre",
+ "commandGetModemStatus": "Obtenir Estat del Mòdem",
+ "commandGetDeviceStatus": "Obtener Estat del Dispositiu",
+ "commandSetSpeedLimit": "Establir Límit de Velocitat",
+ "commandModePowerSaving": "Mode Estalvi de Energia",
+ "commandModeDeepSleep": "Mode Estalvi d'Energia Profund",
+ "commandAlarmGeofence": "Establir Alarma de Geo-Zona",
+ "commandAlarmBattery": "Establir Alarma de Bateria",
+ "commandAlarmSos": "Establir Alarma de SOS",
+ "commandAlarmRemove": "Establir eliminar Alarma",
+ "commandAlarmClock": "Establir Alarma d'Hora",
+ "commandAlarmSpeed": "Establir Alarma de Velocitat",
+ "commandAlarmFall": "Establir Alarma de Caiguda",
+ "commandAlarmVibration": "Establir Alarma de Vibració",
+ "commandFrequency": "Freqüència",
+ "commandTimezone": "Compensació de zona horaria",
+ "commandMessage": "Missatge",
+ "commandRadius": "Ràdio",
+ "commandEnable": "Activat",
+ "commandData": "Dades",
+ "commandIndex": "Índex",
+ "commandPhone": "Número de Telèfon",
+ "commandServer": "Servidor",
+ "commandPort": "Port",
+ "eventAll": "Tots els events",
+ "eventDeviceOnline": "Dispositiu en Línia",
+ "eventDeviceUnknown": "Dispositiu en estat Desconegut",
+ "eventDeviceOffline": "Dispositiu Fora de Línia",
+ "eventDeviceInactive": "Dispositiu Inactiu",
+ "eventQueuedCommandSent": "Comanda en cua enviada",
+ "eventDeviceMoving": "Dispositiu en Moviment",
+ "eventDeviceStopped": "Dispositiu Aturat",
+ "eventDeviceOverspeed": "Excés del límit de Velocitat",
+ "eventDeviceFuelDrop": "Pèrdua de Combustible",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Resultat de la comanda",
+ "eventGeofenceEnter": "Entrada a la Geo-Zona",
+ "eventGeofenceExit": "Sortida de la Geo-Zona",
+ "eventAlarm": "Alarma",
+ "eventIgnitionOn": "Ignició ON",
+ "eventIgnitionOff": "Ignició OFF",
+ "eventMaintenance": "Es requereix manteniment",
+ "eventTextMessage": "Missatge de text rebut",
+ "eventDriverChanged": "El conductor ha canviat",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Desplaçar-se fins l'últim",
+ "eventsSoundEvents": "So d'Esdeveniments",
+ "eventsSoundAlarms": "So d'Alarma",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibració",
+ "alarmMovement": "Moviment",
+ "alarmLowspeed": "Baixa Velocitat",
+ "alarmOverspeed": "Excés de Velocitat",
+ "alarmFallDown": "Alarma de caiguda",
+ "alarmLowPower": "Energia baixa",
+ "alarmLowBattery": "Bateria Baixa",
+ "alarmFault": "Alarma de error",
+ "alarmPowerOff": "Apagat",
+ "alarmPowerOn": "Encès",
+ "alarmDoor": "Porta",
+ "alarmLock": "Blocat",
+ "alarmUnlock": "Desblocat",
+ "alarmGeofence": "Geo-Zona",
+ "alarmGeofenceEnter": "El Dispositiu ha entrat a la Geo-Zona",
+ "alarmGeofenceExit": "El Dispositiu ha sortit de la Geo-Zona",
+ "alarmGpsAntennaCut": "Antena del GPS tallada",
+ "alarmAccident": "Accident",
+ "alarmTow": "Grua d'arrossegament",
+ "alarmIdle": "Repòs",
+ "alarmHighRpm": "Revolucions altes",
+ "alarmHardAcceleration": "Acceleració brusca",
+ "alarmHardBraking": "Frenada extrema",
+ "alarmHardCornering": "Gir brusc",
+ "alarmLaneChange": "Canvi de carril",
+ "alarmFatigueDriving": "Conducció amb fatiga",
+ "alarmPowerCut": "Energia desconectada",
+ "alarmPowerRestored": "Energia restaurada",
+ "alarmJamming": "Interferència",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Aparcament",
+ "alarmBonnet": "Capó",
+ "alarmFootBrake": "Fre de peu",
+ "alarmFuelLeak": "Fuga de combustible",
+ "alarmTampering": "Manipulació",
+ "alarmRemoving": "Eliminant",
+ "notificationType": "Tipus de Notificació",
+ "notificationAlways": "Tots els dispositius",
+ "notificationNotificators": "Canals",
+ "notificatorCommand": "Comanda",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Correu",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Repetir",
+ "reportCombined": "Combinat",
+ "reportRoute": "Ruta",
+ "reportEvents": "Esdeveniments",
+ "reportTrips": "Viatges",
+ "reportStops": "Parades",
+ "reportSummary": "Resum",
+ "reportDaily": "Resum diari",
+ "reportChart": "Gràfica",
+ "reportConfigure": "Configurar",
+ "reportEventTypes": "Tipus d'esdeveniment",
+ "reportChartType": "Tipus de gràfica",
+ "reportShowMarkers": "Mostrar marcadors",
+ "reportExport": "Exportar",
+ "reportEmail": "Informe per correu",
+ "reportSchedule": "Horari",
+ "reportPeriod": "Període",
+ "reportCustom": "Personalitzat",
+ "reportToday": "Avui",
+ "reportYesterday": "Ahir",
+ "reportThisWeek": "Setmana Actual",
+ "reportPreviousWeek": "Setmana Anterior",
+ "reportThisMonth": "Mes Actual",
+ "reportPreviousMonth": "Mes Anterior",
+ "reportDeviceName": "Nom",
+ "reportAverageSpeed": "Velocitat Mitjana",
+ "reportMaximumSpeed": "Velocitat Màxima",
+ "reportEngineHours": "Hores de Motor",
+ "reportDuration": "Durada",
+ "reportStartDate": "Data Inical",
+ "reportStartTime": "Hora Inical",
+ "reportStartAddress": "Adreça Inicial",
+ "reportEndTime": "Hora Final",
+ "reportEndAddress": "Adreça Final",
+ "reportSpentFuel": "Combustible consumit",
+ "reportStartOdometer": "Odòmetre inical",
+ "reportEndOdometer": "Odòmetre final",
+ "statisticsTitle": "Estadístiques",
+ "statisticsCaptureTime": "Data de captura",
+ "statisticsActiveUsers": "Usuaris Actius",
+ "statisticsActiveDevices": "Dispositius Actius",
+ "statisticsRequests": "Peticions",
+ "statisticsMessagesReceived": "Missatges rebuts",
+ "statisticsMessagesStored": "Missatges guardats",
+ "statisticsGeocoder": "Sol·licituds del codificador geogràfic",
+ "statisticsGeolocation": "Sol·licituds de geolocalització",
+ "categoryArrow": "Fletxa",
+ "categoryDefault": "Predeterminat",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicicleta",
+ "categoryBoat": "Vaixell",
+ "categoryBus": "Autobús",
+ "categoryCar": "Automòbil",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Grua",
+ "categoryHelicopter": "Helicòpter",
+ "categoryMotorcycle": "Motocicleta",
+ "categoryOffroad": "Totterreny",
+ "categoryPerson": "Persona",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Avió",
+ "categoryShip": "Vaixell",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Tren",
+ "categoryTram": "Tramvia",
+ "categoryTrolleybus": "Troleibús",
+ "categoryTruck": "Camió",
+ "categoryVan": "Furgoneta",
+ "categoryScooter": "Moto",
+ "maintenanceStart": "Iniciar",
+ "maintenancePeriod": "Període"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/cs.json b/legacy/web/l10n/cs.json
new file mode 100644
index 00000000..10a1f1fa
--- /dev/null
+++ b/legacy/web/l10n/cs.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Načítám...",
+ "sharedHide": "Skrýt",
+ "sharedSave": "Uložit",
+ "sharedUpload": "Upload",
+ "sharedSet": "Nastavit",
+ "sharedCancel": "Zrušit",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Přidat",
+ "sharedEdit": "Změnit",
+ "sharedRemove": "Odstranit",
+ "sharedRemoveConfirm": "Odstranit položku?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Ano",
+ "sharedNo": "Ne",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Hodina",
+ "sharedMinute": "Minuta",
+ "sharedSecond": "Sekunda",
+ "sharedDays": "dny",
+ "sharedHours": "hodiny",
+ "sharedMinutes": "minuty",
+ "sharedDecimalDegrees": "Desetinné stupně",
+ "sharedDegreesDecimalMinutes": "Desetinné minuty",
+ "sharedDegreesMinutesSeconds": "Desetinné sekundy",
+ "sharedName": "Jméno",
+ "sharedDescription": "Popis",
+ "sharedSearch": "Hledat",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Zóna",
+ "sharedGeofences": "Zóny",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Upozornění",
+ "sharedNotification": "Upozornění",
+ "sharedAttributes": "Atributy",
+ "sharedAttribute": "Atribut",
+ "sharedDrivers": "Řidiči",
+ "sharedDriver": "Řidič",
+ "sharedArea": "Oblast",
+ "sharedSound": "Zvuk upozornění",
+ "sharedType": "Typ",
+ "sharedDistance": "Vzdálenost",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Litr",
+ "sharedImpGallon": "Britský galon",
+ "sharedUsGallon": "Americký galon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Získat stav mapy",
+ "sharedComputedAttribute": "Vypočítaná vlastnost",
+ "sharedComputedAttributes": "Vypočítané vlastnosti",
+ "sharedCheckComputedAttribute": "Zkontrolovat vypočítanou vlastnost",
+ "sharedExpression": "Výraz",
+ "sharedDevice": "Zařízení",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Odeslat testovací oznámení",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Kalendář",
+ "sharedCalendars": "Kalendáře",
+ "sharedFile": "Soubor",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Vybrat soubor",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Povinné",
+ "sharedPreferences": "Nastavení",
+ "sharedPermissions": "Oprávnění",
+ "sharedConnections": "Připojení",
+ "sharedExtra": "Volitelné",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Řetězec",
+ "sharedTypeNumber": "Číslo",
+ "sharedTypeBoolean": "Logická hodnota",
+ "sharedTimezone": "Časová zóna",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Uložený příkaz",
+ "sharedSavedCommands": "Uložené příkazy",
+ "sharedNew": "Nový...",
+ "sharedShowAddress": "Zobrazit adresu",
+ "sharedShowDetails": "Více podrobností",
+ "sharedDisabled": "Zakázáno",
+ "sharedMaintenance": "Údržba",
+ "sharedDeviceAccumulators": "Stavy měřidel",
+ "sharedAlarms": "Alarmy",
+ "sharedLocation": "Lokace",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Rychlostní limit",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Vzdálenost křivky",
+ "attributeReportIgnoreOdometer": "Report: Počítadlo kilometrů",
+ "attributeWebReportColor": "Web: Barva reportu",
+ "attributeDevicePassword": "Heslo zařízení",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Počátek nečinnosti zařízení",
+ "attributeDeviceInactivityPeriod": "Období nečinnosti zařízení",
+ "attributeProcessingCopyAttributes": "Procesuji: Kopírování vlastností",
+ "attributeColor": "Barva",
+ "attributeWebLiveRouteLength": "Web: Aktuální délka trasy",
+ "attributeWebSelectZoom": "Web: Přiblížit při výběru",
+ "attributeWebMaxZoom": "Web: Maximální přiblížení",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP server",
+ "attributeMailSmtpPort": "Mail: SMTP port",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS povolit",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS vyžadováno",
+ "attributeMailSmtpSslEnable": "Mail: SMTP SSL povolit",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL důvěřovat",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL protokoly",
+ "attributeMailSmtpFrom": "Mail: SMTP od",
+ "attributeMailSmtpAuth": "Mail: SMTP povolení ověřování",
+ "attributeMailSmtpUsername": "Mail: SMTP uživatelské jméno",
+ "attributeMailSmtpPassword": "Mail: SMTP heslo",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Zakázat události",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Zakázat řidiče",
+ "attributeUiDisableComputedAttributes": "UI: Zakázat vypočítané vlastnosti",
+ "attributeUiDisableCalendars": "UI: Zakázat kalendáře",
+ "attributeUiDisableMaintenance": "UI: Zakázat údržbu",
+ "attributeUiHidePositionAttributes": "UI: Skrýt atributy pozice",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notifikační tokeny",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Chyba",
+ "errorGeneral": "Nesprávné parametry nebo překročení omezení",
+ "errorConnection": "Chyba spojení",
+ "errorSocket": "Chyba připojení webového socketu",
+ "errorZero": "Nemůže být nula",
+ "userEmail": "Email",
+ "userPassword": "Heslo",
+ "userAdmin": "Admin",
+ "userRemember": "Zapamatovat",
+ "userExpirationTime": "Konec platnosti",
+ "userDeviceLimit": "Limit zařízení",
+ "userUserLimit": "Limit uživatele",
+ "userDeviceReadonly": "Zařízení pouze pro čtení",
+ "userLimitCommands": "Limit příkazů",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Přihlášení",
+ "loginLanguage": "Jazyk",
+ "loginReset": "Obnovit Heslo",
+ "loginRegister": "Registrace",
+ "loginLogin": "Přihlášení",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Nesprávný email nebo heslo",
+ "loginCreated": "Nový uživatel byl zaregistrován",
+ "loginResetSuccess": "Zkontroluj si email ",
+ "loginUpdateSuccess": "Nové heslo je nastaveno",
+ "loginLogout": "Odhlášení",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Zařízení a stav",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Zařízení",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifikace",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategorie",
+ "deviceLastUpdate": "Poslední změna",
+ "deviceCommand": "Příkaz",
+ "deviceFollow": "Sledovat",
+ "deviceTotalDistance": "Celková vzdálenost",
+ "deviceStatus": "Stav",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Neznámý",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Skupina",
+ "groupParent": "Skupina",
+ "groupNoGroup": "Žádná skupina",
+ "settingsTitle": "Nastavení",
+ "settingsUser": "Účet",
+ "settingsGroups": "Skupiny",
+ "settingsServer": "Server",
+ "settingsUsers": "Uživatelé",
+ "settingsDistanceUnit": "Jednotka vzdálenosti",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Jednotka rychlosti",
+ "settingsVolumeUnit": "Jednotka objemu",
+ "settingsTwelveHourFormat": "12-hodinový formát",
+ "settingsCoordinateFormat": "Formát souřadnic",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Reporty",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Zařízení",
+ "reportGroup": "Skupina",
+ "reportFrom": "Od",
+ "reportTo": "Komu",
+ "reportShow": "Zobrazit",
+ "reportClear": "Vyprázdnit",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Správný",
+ "positionAccuracy": "Přesnost",
+ "positionLatitude": "Šířka",
+ "positionLongitude": "Délka",
+ "positionAltitude": "Výška",
+ "positionSpeed": "Rychlost",
+ "positionCourse": "Směr",
+ "positionAddress": "Adresa",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Vzdálenost",
+ "positionRpm": "otáček",
+ "positionFuel": "Palivo",
+ "positionPower": "Energie",
+ "positionBattery": "Baterie",
+ "positionRaw": "Čisté",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelity",
+ "positionSatVisible": "Viditelné satelity",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Událost",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Počítadlo kilometrů",
+ "positionServiceOdometer": "Servisní počítadlo kilometrů",
+ "positionTripOdometer": "Počítadlo kilometrů cesty",
+ "positionHours": "Hodiny",
+ "positionSteps": "Kroky",
+ "positionInput": "Vstup",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Výstup",
+ "positionBatteryLevel": "Úroveň baterie",
+ "positionFuelConsumption": "Spotřeba paliva",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Verze firmwaru",
+ "positionVersionHw": "Verze hardwaru",
+ "positionIgnition": "Zapalování",
+ "positionFlags": "Příznaky",
+ "positionCharge": "Nabití",
+ "positionIp": "IP",
+ "positionArchive": "Archiv",
+ "positionVin": "VIN",
+ "positionApproximate": "Přibližný",
+ "positionThrottle": "Škrtící klapka",
+ "positionMotion": "Pohyb",
+ "positionArmed": "Odjištěno",
+ "positionAcceleration": "Akcelerace",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Teplota zařízení",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operátor",
+ "positionCommand": "Příkaz",
+ "positionBlocked": "Blokované",
+ "positionDtcs": "DTC",
+ "positionObdSpeed": "OBD rychlost",
+ "positionObdOdometer": "OBD počítadlo kilometrů",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Unikátní ID ridiče",
+ "positionCard": "Card",
+ "positionImage": "Obraz",
+ "positionVideo": "Video",
+ "positionAudio": "Zvuk",
+ "serverTitle": "Nastavení serveru",
+ "serverZoom": "Přiblížení",
+ "serverRegistration": "Registrace",
+ "serverReadonly": "Pouze pro čtení",
+ "serverForceSettings": "Vynutit nastavení",
+ "serverAnnouncement": "Oznámení",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Mapa",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Vrstva mapy",
+ "mapCustom": "Vlastní (XYZ)",
+ "mapCustomArcgis": "Vlastní (ArcGIS)",
+ "mapCustomLabel": "Vlastní mapa",
+ "mapCarto": "Základní mapy nákladu",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps klíč",
+ "mapBingRoad": "Bing Maps silniční",
+ "mapBingAerial": "Bing Maps Letecký",
+ "mapBingHybrid": "Bing Maps Hybridní",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex mapa",
+ "mapYandexSat": "Yandex satelitní",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox ulice",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox venkovní",
+ "mapMapboxSatellite": "Mapbox satelit",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Základní",
+ "mapMapTilerHybrid": "MapTiler Hybridní",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Mnohoúhelník",
+ "mapShapeCircle": "Kruh",
+ "mapShapePolyline": "Křivka",
+ "mapLiveRoutes": "Trasy živě",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Současná pozice",
+ "mapPoiLayer": "Vrstva s POI",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Stav",
+ "stateName": "Atribut",
+ "stateValue": "Hodnota",
+ "commandTitle": "Příkaz",
+ "commandSend": "Odeslat",
+ "commandSent": "Příkaz odeslán",
+ "commandQueued": "Příkaz zařazen do fronty",
+ "commandUnit": "Jednotka",
+ "commandCustom": "Volitelný příkaz",
+ "commandDeviceIdentification": "Identifikace zařízení",
+ "commandPositionSingle": "Jednotný report",
+ "commandPositionPeriodic": "Pravidelný report",
+ "commandPositionStop": "Zastavit report",
+ "commandEngineStop": "Zastavit motor",
+ "commandEngineResume": "Nastartovat motor",
+ "commandAlarmArm": "Aktivovat alarm",
+ "commandAlarmDisarm": "Deaktivovat alarm",
+ "commandAlarmDismiss": "Zrušit alarm",
+ "commandSetTimezone": "Nastavit časovou zónu",
+ "commandRequestPhoto": "Vyžádat fotku",
+ "commandPowerOff": "Vypnout zařízení",
+ "commandRebootDevice": "Restartovat zařízení",
+ "commandFactoryReset": "Obnovit nastavení",
+ "commandSendSms": "Odeslat SMS",
+ "commandSendUssd": "Odeslat USSD",
+ "commandSosNumber": "Nastavit SOS číslo",
+ "commandSilenceTime": "Nastavit čas tichého módu",
+ "commandSetPhonebook": "Nastavit telefonní seznam",
+ "commandVoiceMessage": "Hlasová zpráva",
+ "commandOutputControl": "Ovládání výstupu",
+ "commandVoiceMonitoring": "Monitorování hlasu",
+ "commandSetAgps": "Nastavit AGPS",
+ "commandSetIndicator": "Nastavit indikátor",
+ "commandConfiguration": "Nastavení",
+ "commandGetVersion": "Zjistit verzi",
+ "commandFirmwareUpdate": "Aktualizovat firmware",
+ "commandSetConnection": "Nastavit spojení",
+ "commandSetOdometer": "Nastavit počítadlo kilometrů",
+ "commandGetModemStatus": "Získat stav modemu",
+ "commandGetDeviceStatus": "Získat stav zařízení",
+ "commandSetSpeedLimit": "Nastavit rychlostní limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekvence",
+ "commandTimezone": "Ofset časové zóny",
+ "commandMessage": "Zpráva",
+ "commandRadius": "Okruh",
+ "commandEnable": "Povolit",
+ "commandData": "Data",
+ "commandIndex": "Index",
+ "commandPhone": "Telefonní číslo",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Všechny události",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status neznámý",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Zařízení je neaktivní",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Zařízení se přesouvá",
+ "eventDeviceStopped": "Zařízení bylo zastaveno",
+ "eventDeviceOverspeed": "Rychlostní limit překročen",
+ "eventDeviceFuelDrop": "Pokles paliva",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Výsledek příkazu",
+ "eventGeofenceEnter": "Vstoupeno do geozóny",
+ "eventGeofenceExit": "Geozóna opuštěna",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Zážeh zapnutý",
+ "eventIgnitionOff": "Zážeh vypnutý",
+ "eventMaintenance": "Vyžadována údržba",
+ "eventTextMessage": "Obdržena textová zpráva",
+ "eventDriverChanged": "Řidič vyměněn",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Posunout na poslední",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Hlavní",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibrace",
+ "alarmMovement": "Pohyb",
+ "alarmLowspeed": "Nízká rychlost",
+ "alarmOverspeed": "Překročení rychlosti",
+ "alarmFallDown": "Pád",
+ "alarmLowPower": "Nízký výkon",
+ "alarmLowBattery": "Nízké napětí baterie",
+ "alarmFault": "Chyba",
+ "alarmPowerOff": "Vypnout",
+ "alarmPowerOn": "Zapnout",
+ "alarmDoor": "Dveře",
+ "alarmLock": "Zamknout",
+ "alarmUnlock": "Odemknout",
+ "alarmGeofence": "Geozóna",
+ "alarmGeofenceEnter": "Vstup do geozóny",
+ "alarmGeofenceExit": "Konec geozóny",
+ "alarmGpsAntennaCut": "Odpojení GPS antény",
+ "alarmAccident": "Nehoda",
+ "alarmTow": "Vlek",
+ "alarmIdle": "Nečinnost",
+ "alarmHighRpm": "Vysoké ot/min",
+ "alarmHardAcceleration": "Silná akcelerace",
+ "alarmHardBraking": "Silné brždění",
+ "alarmHardCornering": "Jízda smykem",
+ "alarmLaneChange": "Změna pruhu",
+ "alarmFatigueDriving": "Únava při řízení",
+ "alarmPowerCut": "Výpadek napájení",
+ "alarmPowerRestored": "Napájení obnoveno",
+ "alarmJamming": "Zaseknutí",
+ "alarmTemperature": "Teplota",
+ "alarmParking": "Parkování",
+ "alarmBonnet": "Kapota",
+ "alarmFootBrake": "Nožní brzda",
+ "alarmFuelLeak": "Únik paliva",
+ "alarmTampering": "Manipulování",
+ "alarmRemoving": "Odstraňuji",
+ "notificationType": "Typ oznámení",
+ "notificationAlways": "Všechna zařízení",
+ "notificationNotificators": "Kanály",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Přehrát",
+ "reportCombined": "Combined",
+ "reportRoute": "Trasa",
+ "reportEvents": "Události",
+ "reportTrips": "Cesty",
+ "reportStops": "Zastávky",
+ "reportSummary": "Souhrn",
+ "reportDaily": "Denní přehled",
+ "reportChart": "Graf",
+ "reportConfigure": "Nastavit",
+ "reportEventTypes": "Typy událostí",
+ "reportChartType": "Typ grafu",
+ "reportShowMarkers": "Zobrazit značky",
+ "reportExport": "Exportovat",
+ "reportEmail": "Zaslat report mailem",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Období",
+ "reportCustom": "Vlastní",
+ "reportToday": "Dnes",
+ "reportYesterday": "Včera",
+ "reportThisWeek": "Tento týden",
+ "reportPreviousWeek": "Minulý týden",
+ "reportThisMonth": "Tento měsíc",
+ "reportPreviousMonth": "Minulý měsíc",
+ "reportDeviceName": "Jméno zařízení",
+ "reportAverageSpeed": "Průměrná rychlost",
+ "reportMaximumSpeed": "Maximální rychlost",
+ "reportEngineHours": "Motohodiny",
+ "reportDuration": "Trvání",
+ "reportStartDate": "Počáteční datum",
+ "reportStartTime": "Čas startu",
+ "reportStartAddress": "Adresa startu",
+ "reportEndTime": "Čas konce",
+ "reportEndAddress": "Adresa konce",
+ "reportSpentFuel": "Spotřebované palivo",
+ "reportStartOdometer": "Start počítadla kilometrů",
+ "reportEndOdometer": "Konec počítadla kilometrů",
+ "statisticsTitle": "Statistiky",
+ "statisticsCaptureTime": "Čas zachycení",
+ "statisticsActiveUsers": "Aktivní uživatelé",
+ "statisticsActiveDevices": "Aktivní zařízení",
+ "statisticsRequests": "Požadavky",
+ "statisticsMessagesReceived": "Obdržené zprávy",
+ "statisticsMessagesStored": "Uložené zprávy",
+ "statisticsGeocoder": "Požadavky Geocodera",
+ "statisticsGeolocation": "Požadavky Geolokace",
+ "categoryArrow": "Šipka",
+ "categoryDefault": "Výchozí",
+ "categoryAnimal": "Zvíře",
+ "categoryBicycle": "Kolo",
+ "categoryBoat": "Loď",
+ "categoryBus": "Autobus",
+ "categoryCar": "Auto",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Jeřáb",
+ "categoryHelicopter": "Helikoptéra",
+ "categoryMotorcycle": "Motocykl",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Osoba",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Letadlo",
+ "categoryShip": "Loď",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Vlak",
+ "categoryTram": "Tramvaj",
+ "categoryTrolleybus": "Trolejbus",
+ "categoryTruck": "Nákladní auto",
+ "categoryVan": "Dodávka",
+ "categoryScooter": "Koloběžka",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Perioda"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/da.json b/legacy/web/l10n/da.json
new file mode 100644
index 00000000..4c24a3c6
--- /dev/null
+++ b/legacy/web/l10n/da.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Indlæser... ",
+ "sharedHide": "Skjul",
+ "sharedSave": "Gem",
+ "sharedUpload": "Upload",
+ "sharedSet": "Indstil",
+ "sharedCancel": "Fortryd",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Tilføj",
+ "sharedEdit": "Rediger",
+ "sharedRemove": "Fjern",
+ "sharedRemoveConfirm": "Fjern enhed?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Ja",
+ "sharedNo": "Nej",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "Nml",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "knob",
+ "sharedKmh": "km/t",
+ "sharedMph": "mph",
+ "sharedHour": "Time",
+ "sharedMinute": "Minut",
+ "sharedSecond": "Sekund",
+ "sharedDays": "dage",
+ "sharedHours": "timer",
+ "sharedMinutes": "minutter",
+ "sharedDecimalDegrees": "Decimal grader",
+ "sharedDegreesDecimalMinutes": "Grader decimal minutter",
+ "sharedDegreesMinutesSeconds": "Grader decimal sekunder",
+ "sharedName": "Navn",
+ "sharedDescription": "Beskrivelse",
+ "sharedSearch": "Søg",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geofence",
+ "sharedGeofences": "Geofences",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Notifikationer",
+ "sharedNotification": "Notifikation",
+ "sharedAttributes": "Egenskaber",
+ "sharedAttribute": "Egenskab",
+ "sharedDrivers": "Chauffører",
+ "sharedDriver": "Chauffør",
+ "sharedArea": "Område",
+ "sharedSound": "Advarsels lyd",
+ "sharedType": "Type",
+ "sharedDistance": "Afstand",
+ "sharedHourAbbreviation": "t",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "I",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Motorhjelm",
+ "sharedUsGallon": "Amerikansk gallon",
+ "sharedLiterPerHourAbbreviation": "l/time",
+ "sharedGetMapState": "Kort status",
+ "sharedComputedAttribute": "Udregnet attribut",
+ "sharedComputedAttributes": "Udregnede attributter",
+ "sharedCheckComputedAttribute": "Kontroller udregnet attribut",
+ "sharedExpression": "Udtryk",
+ "sharedDevice": "Enhed",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send Test notifikation",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Kalender",
+ "sharedCalendars": "Kalendere",
+ "sharedFile": "Fil",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Vælg fil",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Krævet",
+ "sharedPreferences": "Foretrukne",
+ "sharedPermissions": "Tilladelser",
+ "sharedConnections": "Forbindelser",
+ "sharedExtra": "Ekstra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "tekststreng",
+ "sharedTypeNumber": "ciffer",
+ "sharedTypeBoolean": "Boolsk",
+ "sharedTimezone": "Tidszone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Gemt kommando",
+ "sharedSavedCommands": "Gemte Kommandoer",
+ "sharedNew": "Ny...",
+ "sharedShowAddress": "Vis adresse",
+ "sharedShowDetails": "Flere detailer",
+ "sharedDisabled": "Deaktiveret",
+ "sharedMaintenance": "Vedligeholdelse",
+ "sharedDeviceAccumulators": "Akkumulatorer",
+ "sharedAlarms": "Alarmer",
+ "sharedLocation": "Beliggenhed",
+ "sharedImport": "Importer",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Hastigheds grænse",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline afstand",
+ "attributeReportIgnoreOdometer": "Rapport: Ignorer odometer",
+ "attributeWebReportColor": "Web : Rapport farve",
+ "attributeDevicePassword": "Enheds kodeord",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Start af enhedens inaktivitet",
+ "attributeDeviceInactivityPeriod": "Enheds inaktivitetsperiode",
+ "attributeProcessingCopyAttributes": "Bearbejder: Kopier attribut",
+ "attributeColor": "Farve",
+ "attributeWebLiveRouteLength": "Web: live rute længde",
+ "attributeWebSelectZoom": "Web: Zoom ved vælg",
+ "attributeWebMaxZoom": "Web: Maksimal zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP host",
+ "attributeMailSmtpPort": "Mail : SMTP port",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS Enable",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS Required",
+ "attributeMailSmtpSslEnable": "Mail: SMTP slå SSL til",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL Trust ",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL Protocols",
+ "attributeMailSmtpFrom": "Mail: SMTP From ",
+ "attributeMailSmtpAuth": "Mail: SMTP Auth Enable ",
+ "attributeMailSmtpUsername": "Mail: SMTP Brugernavn",
+ "attributeMailSmtpPassword": "Mail: SMTP Kodeord",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "Deaktiver begivenheder",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "Deaktiver chauffører",
+ "attributeUiDisableComputedAttributes": "Deaktiver beregnede attributter",
+ "attributeUiDisableCalendars": "Deaktiver kalendere",
+ "attributeUiDisableMaintenance": "Deaktiver vedligeholdelse",
+ "attributeUiHidePositionAttributes": "Skjul positionsattributter",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notifikations Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Fejl",
+ "errorGeneral": "ulovlig parameter ",
+ "errorConnection": "Tilslutning fejl",
+ "errorSocket": "Web tilslutnings fejl",
+ "errorZero": "Kan ikke være nul",
+ "userEmail": "Email",
+ "userPassword": "Kodeord",
+ "userAdmin": "Admin",
+ "userRemember": "Husk",
+ "userExpirationTime": "Udløb",
+ "userDeviceLimit": "Enheds grænse",
+ "userUserLimit": "Bruger grænse",
+ "userDeviceReadonly": "Enhed kun læsbar",
+ "userLimitCommands": "Begrænset kommandoer",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Log på",
+ "loginLanguage": "Sprog",
+ "loginReset": "Nulstille kodeord",
+ "loginRegister": "Registrer",
+ "loginLogin": "Log på",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Fejl i email adresse eller kodeord",
+ "loginCreated": "Ny bruger er registreret",
+ "loginResetSuccess": "Tjek din e-mail",
+ "loginUpdateSuccess": "Ny adgangskode er indstillet",
+ "loginLogout": "Log af",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Enheder og status",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Enheder",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Imei nr",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategori",
+ "deviceLastUpdate": "Seneste opdatering",
+ "deviceCommand": "Kommando",
+ "deviceFollow": "Følg",
+ "deviceTotalDistance": "Total distance",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "On-line",
+ "deviceStatusOffline": "Off-line",
+ "deviceStatusUnknown": "Ukendt",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Gruppe",
+ "groupParent": "Gruppe",
+ "groupNoGroup": "Ingen gruppe",
+ "settingsTitle": "Indstillinger",
+ "settingsUser": "Konto",
+ "settingsGroups": "Grupper",
+ "settingsServer": "Server",
+ "settingsUsers": "Brugere",
+ "settingsDistanceUnit": "Afstands enhed",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Hastigheds enhed",
+ "settingsVolumeUnit": "Volume enhed",
+ "settingsTwelveHourFormat": "12 timers format",
+ "settingsCoordinateFormat": "Koordinats format",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Rapporter",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Enhed",
+ "reportGroup": "Gruppe",
+ "reportFrom": "Fra",
+ "reportTo": "Til",
+ "reportShow": "Vis",
+ "reportClear": "Ryd",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Valid",
+ "positionAccuracy": "Nøjagtighed",
+ "positionLatitude": "Breddegrad",
+ "positionLongitude": "Længdegrad",
+ "positionAltitude": "Højde",
+ "positionSpeed": "Hastighed",
+ "positionCourse": "Kurs",
+ "positionAddress": "Adresse",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Distance",
+ "positionRpm": "Omdr.",
+ "positionFuel": "Brændstof",
+ "positionPower": "Strøm",
+ "positionBattery": "Batteri",
+ "positionRaw": "Rå",
+ "positionIndex": "Indeks",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelitter",
+ "positionSatVisible": "Synlige satelitter",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Hændelse",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Km tæller",
+ "positionServiceOdometer": "Service Km tæller",
+ "positionTripOdometer": "Trip tæller",
+ "positionHours": "timer",
+ "positionSteps": "Skridt",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Batteri niveau",
+ "positionFuelConsumption": "Brændstof forbrug",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware version",
+ "positionVersionHw": "Hardware version",
+ "positionIgnition": "Tænding på ",
+ "positionFlags": "Flag",
+ "positionCharge": "Oplad",
+ "positionIp": "IP",
+ "positionArchive": "Arkiv",
+ "positionVin": "VIN",
+ "positionApproximate": "Cirka",
+ "positionThrottle": "Gas",
+ "positionMotion": "Bevægelse",
+ "positionArmed": "Armeret",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Enheds temperatur",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operatør",
+ "positionCommand": "Kommando",
+ "positionBlocked": "Blokeret",
+ "positionDtcs": "DTC's",
+ "positionObdSpeed": "OBD Hastighed",
+ "positionObdOdometer": "OBD km tæller",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Chaufførs unikke ID",
+ "positionCard": "Card",
+ "positionImage": "Billede",
+ "positionVideo": "Video",
+ "positionAudio": "Lyd",
+ "serverTitle": "Server indstillinger",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registrering",
+ "serverReadonly": "Læs",
+ "serverForceSettings": "Gennemtving opdatering",
+ "serverAnnouncement": "Meddelelse",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Kort",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Kort opsætning",
+ "mapCustom": "Brugerdefineret (XYZ)",
+ "mapCustomArcgis": "Brugerdefineret (ArcGIS)",
+ "mapCustomLabel": "Brugerdefineret kort",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Kort",
+ "mapYandexSat": "Yandex Satellit",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox gader",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox udendørs",
+ "mapMapboxSatellite": "Mapbox satellit",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polygon",
+ "mapShapeCircle": "Cirkel",
+ "mapShapePolyline": "Polyline",
+ "mapLiveRoutes": "Live ruter",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Lag",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Status",
+ "stateName": "Parameter",
+ "stateValue": "Værdi",
+ "commandTitle": "Kommando",
+ "commandSend": "Send",
+ "commandSent": "Kommando sendt",
+ "commandQueued": "Kommando i kø",
+ "commandUnit": "Enhed",
+ "commandCustom": "Skræddersyet kommando",
+ "commandDeviceIdentification": "Enheds id",
+ "commandPositionSingle": "Enkel rapport",
+ "commandPositionPeriodic": "Periodisk Rapportering",
+ "commandPositionStop": "Stop Rapportering",
+ "commandEngineStop": "Stop motor",
+ "commandEngineResume": "Genstart motor",
+ "commandAlarmArm": "Armer alarm",
+ "commandAlarmDisarm": "Slå alarm fra",
+ "commandAlarmDismiss": "Afvis alarm",
+ "commandSetTimezone": "Sæt tidszone",
+ "commandRequestPhoto": "Tag billede",
+ "commandPowerOff": "Sluk for enhed",
+ "commandRebootDevice": "Genstart enhed",
+ "commandFactoryReset": "Gendan fabriksindstillinger",
+ "commandSendSms": "send SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "Angiv SOS nummer",
+ "commandSilenceTime": "Angiv lydløs tid",
+ "commandSetPhonebook": "Angiv telefonbog",
+ "commandVoiceMessage": "Tale meddelelse",
+ "commandOutputControl": "Output kontrol",
+ "commandVoiceMonitoring": "Stemmeovervågning",
+ "commandSetAgps": "Konfigurer AGPS",
+ "commandSetIndicator": "Gem indikator",
+ "commandConfiguration": "Konfiguration",
+ "commandGetVersion": "Hent version",
+ "commandFirmwareUpdate": "Opdater irmware",
+ "commandSetConnection": "Konfigurer forbindelse",
+ "commandSetOdometer": "Konfigurer kilometertæller",
+ "commandGetModemStatus": "Hent Modem status",
+ "commandGetDeviceStatus": "Hent enheds status",
+ "commandSetSpeedLimit": "Indstil hastighedsgrænse",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekvens",
+ "commandTimezone": "Tidszone forskel",
+ "commandMessage": "Meddelelse",
+ "commandRadius": "Radius",
+ "commandEnable": "aktiver",
+ "commandData": "Data",
+ "commandIndex": "Indeks",
+ "commandPhone": "Telefon nummer",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Alle begivenheder",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status ukendt",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Enhed inaktiv",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Enheden bevæger sig",
+ "eventDeviceStopped": "Enheden stoppet",
+ "eventDeviceOverspeed": "Hastighedsgrænsen overskredet",
+ "eventDeviceFuelDrop": "Brændstoffald",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Resultat af kommando",
+ "eventGeofenceEnter": "Geofence indtastet",
+ "eventGeofenceExit": "Geofence forladt",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Tænding tændt",
+ "eventIgnitionOff": "Tænding slukket",
+ "eventMaintenance": "Vedligeholdelse krævet",
+ "eventTextMessage": "Tekst besked modtaget",
+ "eventDriverChanged": "Chaufførskift",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Rul til sidste",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Generel",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Bevægelse",
+ "alarmLowspeed": "Lav hastighed",
+ "alarmOverspeed": "Hastighedsoverskridelse",
+ "alarmFallDown": "Fald",
+ "alarmLowPower": "Lav strøm",
+ "alarmLowBattery": "Lavt batteri",
+ "alarmFault": "Fejl",
+ "alarmPowerOff": "Sluk",
+ "alarmPowerOn": "Tænd",
+ "alarmDoor": "Dør",
+ "alarmLock": "Lås",
+ "alarmUnlock": "Lås op",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS-antennesnit",
+ "alarmAccident": "Ulykke",
+ "alarmTow": "Bugseret",
+ "alarmIdle": "Ledig",
+ "alarmHighRpm": "Høj RPM",
+ "alarmHardAcceleration": "Hård acceleration",
+ "alarmHardBraking": "Hård bremsning",
+ "alarmHardCornering": "Hård sving",
+ "alarmLaneChange": "Vognbaneskift",
+ "alarmFatigueDriving": "Træthedskørsel",
+ "alarmPowerCut": "Strømafbrydelse",
+ "alarmPowerRestored": "Strøm genoprettet",
+ "alarmJamming": "Fastklemning",
+ "alarmTemperature": "Temperatur",
+ "alarmParking": "Parkering",
+ "alarmBonnet": "Motorhjelm",
+ "alarmFootBrake": "Fodbremse",
+ "alarmFuelLeak": "Brændstoflækage",
+ "alarmTampering": "Manipulering",
+ "alarmRemoving": "Fjerner",
+ "notificationType": "Type af notifikation",
+ "notificationAlways": "Alle enheder",
+ "notificationNotificators": "Kanaler",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Genafspil",
+ "reportCombined": "Combined",
+ "reportRoute": "Rute",
+ "reportEvents": "Begivenheder",
+ "reportTrips": "Ture",
+ "reportStops": "Antal stop",
+ "reportSummary": "Resume",
+ "reportDaily": "Daglig opsummering",
+ "reportChart": "Graf",
+ "reportConfigure": "Konfigurer",
+ "reportEventTypes": "Begivenheds typer",
+ "reportChartType": "Graf type",
+ "reportShowMarkers": "Vis markeringer",
+ "reportExport": "Eksporter",
+ "reportEmail": "Email rapport",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Periode",
+ "reportCustom": "Brugerdefineret",
+ "reportToday": "I dag",
+ "reportYesterday": "I går",
+ "reportThisWeek": "Denne uge",
+ "reportPreviousWeek": "Forrige uge",
+ "reportThisMonth": "Denne måned",
+ "reportPreviousMonth": "Forrige måned",
+ "reportDeviceName": "Enheds navn",
+ "reportAverageSpeed": "Gennemsnits hastighed",
+ "reportMaximumSpeed": "Maximum hastighed",
+ "reportEngineHours": "Motor aktiv timer",
+ "reportDuration": "Varighed",
+ "reportStartDate": "Start dato",
+ "reportStartTime": "Start tidspunkt",
+ "reportStartAddress": "Start adresse",
+ "reportEndTime": "Slut tidspunkt",
+ "reportEndAddress": "Slut adresse",
+ "reportSpentFuel": "Brændstof forbrug",
+ "reportStartOdometer": "Kilometertæller start",
+ "reportEndOdometer": "Kilometertæller slut",
+ "statisticsTitle": "Statistik",
+ "statisticsCaptureTime": "Noter tid",
+ "statisticsActiveUsers": "Aktive brugere",
+ "statisticsActiveDevices": "Aktive enheder",
+ "statisticsRequests": "Anmodninger",
+ "statisticsMessagesReceived": "Meddelelser modtaget",
+ "statisticsMessagesStored": "Meddelelser gemt",
+ "statisticsGeocoder": "Geokoder opslag",
+ "statisticsGeolocation": "Geolocation opslag",
+ "categoryArrow": "Pil",
+ "categoryDefault": "Standard",
+ "categoryAnimal": "Dyr",
+ "categoryBicycle": "Cykel",
+ "categoryBoat": "Båd",
+ "categoryBus": "Bus",
+ "categoryCar": "Bil",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Kran",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motorcykel",
+ "categoryOffroad": "Off-road",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup ",
+ "categoryPlane": "Fly",
+ "categoryShip": "Skib",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Tog",
+ "categoryTram": "Sporvogn",
+ "categoryTrolleybus": "Bybus",
+ "categoryTruck": "Lastbil",
+ "categoryVan": "Van",
+ "categoryScooter": "scooter",
+ "maintenanceStart": "start",
+ "maintenancePeriod": "Periode"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/de.json b/legacy/web/l10n/de.json
new file mode 100644
index 00000000..3e937ea0
--- /dev/null
+++ b/legacy/web/l10n/de.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Lade...",
+ "sharedHide": "Ausblenden",
+ "sharedSave": "Speichern",
+ "sharedUpload": "Upload",
+ "sharedSet": "Speichern",
+ "sharedCancel": "Abbrechen",
+ "sharedCopy": "Kopieren",
+ "sharedAdd": "Hinzufügen",
+ "sharedEdit": "Bearbeiten",
+ "sharedRemove": "Entfernen",
+ "sharedRemoveConfirm": "Objekt entfernen?",
+ "sharedNoData": "Keine Daten",
+ "sharedSubject": "Betreff",
+ "sharedYes": "Ja",
+ "sharedNo": "Nein",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Stunde",
+ "sharedMinute": "Minute",
+ "sharedSecond": "Sekunde",
+ "sharedDays": "Tage",
+ "sharedHours": "Stunden",
+ "sharedMinutes": "Minuten",
+ "sharedDecimalDegrees": "Dezimalgrad",
+ "sharedDegreesDecimalMinutes": "Dezimalgrad Minuten",
+ "sharedDegreesMinutesSeconds": "Grad Minuten Sekunden",
+ "sharedName": "Name",
+ "sharedDescription": "Beschreibung",
+ "sharedSearch": "Suchen",
+ "sharedIconScale": "Icon-Skalierung",
+ "sharedGeofence": "Geo-Zaun",
+ "sharedGeofences": "Geo-Zäune",
+ "sharedCreateGeofence": "Geozaun erstellen",
+ "sharedNotifications": "Benachrichtigungen",
+ "sharedNotification": "Benachrichtigung",
+ "sharedAttributes": "Eigenschaften",
+ "sharedAttribute": "Eigenschaft",
+ "sharedDrivers": "Fahrer",
+ "sharedDriver": "Fahrer",
+ "sharedArea": "Gebiet",
+ "sharedSound": "Benachrichtigungston",
+ "sharedType": "Typ",
+ "sharedDistance": "Entfernung",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallonen",
+ "sharedUsGallon": "U.S. Gallonen",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Aktuelle Position übernehmen",
+ "sharedComputedAttribute": "Berechneter Wert",
+ "sharedComputedAttributes": "Berechnete Werte",
+ "sharedCheckComputedAttribute": "Berechneten Wert prüfen",
+ "sharedExpression": "Ausdruck",
+ "sharedDevice": "Gerät",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Testbenachrichtigung senden",
+ "sharedTestNotificators": "Kanäle testen",
+ "sharedTestExpression": "Ausdruck testen",
+ "sharedCalendar": "Kalender",
+ "sharedCalendars": "Kalender",
+ "sharedFile": "Datei",
+ "sharedSearchDevices": "Geräte suchen",
+ "sharedSortBy": "Sortieren nach",
+ "sharedFilterMap": "Auf Karte filtern",
+ "sharedSelectFile": "Datei auswählen",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Erforderlich",
+ "sharedPreferences": "Einstellungen",
+ "sharedPermissions": "Berechtigungen",
+ "sharedConnections": "Verbindungen",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primär",
+ "sharedSecondary": "Sekundär",
+ "sharedTypeString": "Text",
+ "sharedTypeNumber": "Nummer",
+ "sharedTypeBoolean": "Boolesche Variable",
+ "sharedTimezone": "Zeitzone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Gespeicherter Befehl",
+ "sharedSavedCommands": "Gespeicherte Befehle",
+ "sharedNew": "Neu...",
+ "sharedShowAddress": "Adresse anzeigen",
+ "sharedShowDetails": "Details",
+ "sharedDisabled": "Deaktiviert",
+ "sharedMaintenance": "Wartung",
+ "sharedDeviceAccumulators": "Zählerstände",
+ "sharedAlarms": "Alarme",
+ "sharedLocation": "Ort",
+ "sharedImport": "Import",
+ "sharedColumns": "Spalten",
+ "sharedDropzoneText": "Datei hierhin ziehen oder klicken",
+ "sharedLogs": "Protokolle",
+ "sharedLink": "Link",
+ "calendarSimple": "Einfach",
+ "calendarRecurrence": "Wiederholung",
+ "calendarOnce": "Einmalig",
+ "calendarDaily": "Täglich",
+ "calendarWeekly": "Wöchentlich",
+ "calendarMonthly": "Monatlich",
+ "calendarDays": "Tage",
+ "calendarSunday": "Sonntag",
+ "calendarMonday": "Montag",
+ "calendarTuesday": "Dienstag",
+ "calendarWednesday": "Mittwoch",
+ "calendarThursday": "Donnerstag",
+ "calendarFriday": "Freitag",
+ "calendarSaturday": "Samstag",
+ "attributeShowGeofences": "Geozäune anzeigen",
+ "attributeSpeedLimit": "Höchstgeschwindigkeit",
+ "attributeFuelDropThreshold": "Fuel Drop Schwelle",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Schwelle",
+ "attributePolylineDistance": "Polyliniendistanz",
+ "attributeReportIgnoreOdometer": "Bericht: Kilometerzähler ignorieren",
+ "attributeWebReportColor": "Web: Berichtsfarbe",
+ "attributeDevicePassword": "Gerätepasswort",
+ "attributeDeviceImage": "Gerätebild",
+ "attributeDeviceInactivityStart": "Geräteinaktivität Start",
+ "attributeDeviceInactivityPeriod": "Geräteinaktivität Periode",
+ "attributeProcessingCopyAttributes": "Aktiv: Werte kopieren",
+ "attributeColor": "Farbe",
+ "attributeWebLiveRouteLength": "Web: Länge der Liveroute",
+ "attributeWebSelectZoom": "Web: Mit Auswahl vergrößern",
+ "attributeWebMaxZoom": "Web: Maximaler Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Gerätenamen",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS aktivieren",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS erforderlich",
+ "attributeMailSmtpSslEnable": "Mail: SMTP SSL aktivieren",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL Vertrauensstufe",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL Protokolle",
+ "attributeMailSmtpFrom": "Mail: SMTP Absender",
+ "attributeMailSmtpAuth": "Mail: SMTP Authentifizierung aktivieren",
+ "attributeMailSmtpUsername": "Mail: SMTP Benutzername",
+ "attributeMailSmtpPassword": "Mail: SMTP Passwort",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Attribute deaktivieren",
+ "attributeUiDisableGroups": "UI: Gruppen deaktivieren",
+ "attributeUiDisableEvents": "Oberfläche: Ereignisse deaktivieren",
+ "attributeUiDisableVehicleFeatures": "UI: Fahrzeugfunktionen deaktivieren",
+ "attributeUiDisableDrivers": "Oberfläche: Fahrer deaktivieren",
+ "attributeUiDisableComputedAttributes": "Oberfläche: Berechnete Werte deaktivieren",
+ "attributeUiDisableCalendars": "Oberfläche: Kalender deaktivieren",
+ "attributeUiDisableMaintenance": "Oberfläche: Wartung deaktivieren",
+ "attributeUiHidePositionAttributes": "Oberfläche: Positionsattribute ausblenden",
+ "attributeUiDisableLoginLanguage": "UI: Loginsprache deaktivieren",
+ "attributeNotificationTokens": "Benachrichtungsschlüssel",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Fehler",
+ "errorGeneral": "Ungültige Eingabe oder keine Berechtigung",
+ "errorConnection": "Verbindungsfehler",
+ "errorSocket": "Web Socket Verbindungsfehler",
+ "errorZero": "Darf nicht leer sein",
+ "userEmail": "Email",
+ "userPassword": "Passwort",
+ "userAdmin": "Admin",
+ "userRemember": "Erinnern",
+ "userExpirationTime": "Ablaufdatum",
+ "userDeviceLimit": "Gerätelimit",
+ "userUserLimit": "Benutzerlimit",
+ "userDeviceReadonly": "Gerät nur Betrachten",
+ "userLimitCommands": "Befehle begrenzen",
+ "userDisableReports": "Berichte deaktivieren",
+ "userFixedEmail": "Änderung der E-Mailadresse verbieten",
+ "userToken": "Schlüssel",
+ "userDeleteAccount": "Account löschen",
+ "userTemporary": "Temporär",
+ "loginTitle": "Anmeldung",
+ "loginLanguage": "Sprache",
+ "loginReset": "Passwort zurücksetzen",
+ "loginRegister": "Registrieren",
+ "loginLogin": "Anmelden",
+ "loginOpenId": "Login mit OpenID",
+ "loginFailed": "Falsche Emailadresse oder Passwort",
+ "loginCreated": "Neuer Benutzer wurde registriert",
+ "loginResetSuccess": "Prüfen Sie Ihre E-Mails",
+ "loginUpdateSuccess": "Neues Passwort gespeichert",
+ "loginLogout": "Abmelden",
+ "loginLogo": "Logo",
+ "loginTotpCode": "OTP-Code",
+ "loginTotpKey": "OTP-Schlüssel",
+ "devicesAndState": "Geräte und Status",
+ "deviceSelected": "Ausgewähltes Gerät",
+ "deviceTitle": "Geräte",
+ "devicePrimaryInfo": "Gerät Titel",
+ "deviceSecondaryInfo": "Gerät Detail",
+ "deviceIdentifier": "Kennung",
+ "deviceModel": "Modell",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Symbol",
+ "deviceLastUpdate": "Letzte Aktualisierung",
+ "deviceCommand": "Befehl",
+ "deviceFollow": "Folgen",
+ "deviceTotalDistance": "Gesamt Strecke",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Unbekannt",
+ "deviceRegisterFirst": "Registriere dein erstes Gerät",
+ "deviceIdentifierHelp": "IMEI, Seriennummer or andere ID. Eingabe muss mit dem Identifier übereinstimmen, den das Gerät an den Server überträgt.",
+ "deviceShare": "Gerät freigeben",
+ "groupDialog": "Gruppe",
+ "groupParent": "Gruppe",
+ "groupNoGroup": "Keine Gruppe",
+ "settingsTitle": "Einstellungen",
+ "settingsUser": "Benutzerkonto",
+ "settingsGroups": "Gruppen",
+ "settingsServer": "Server",
+ "settingsUsers": "Benutzer",
+ "settingsDistanceUnit": "Entfernungseinheit",
+ "settingsAltitudeUnit": "Höhe Einheit",
+ "settingsSpeedUnit": "Geschwindigkeitseinheit",
+ "settingsVolumeUnit": "Volumeneinheit",
+ "settingsTwelveHourFormat": "12 Stunden Format",
+ "settingsCoordinateFormat": "Koordinatenformat",
+ "settingsServerVersion": "Server-Version",
+ "settingsAppVersion": "App-Version",
+ "settingsConnection": "Verbindung",
+ "settingsDarkMode": "Dunkelmodus",
+ "settingsTotpEnable": "OTP aktivieren",
+ "settingsTotpForce": "OTP erzwingen",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Intervall",
+ "settingsUpdateAvailable": "Es ist ein Update verfügbar.",
+ "settingsSupport": "Hilfe",
+ "reportTitle": "Berichte",
+ "reportScheduled": "Geplante Berichte",
+ "reportDevice": "Gerät",
+ "reportGroup": "Gruppe",
+ "reportFrom": "Von",
+ "reportTo": "Bis",
+ "reportShow": "Anzeigen",
+ "reportClear": "Leeren",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Gerätezeit",
+ "positionServerTime": "Serverzeit",
+ "positionValid": "Gültig",
+ "positionAccuracy": "Genauigkeit",
+ "positionLatitude": "Breitengrad",
+ "positionLongitude": "Längengrad",
+ "positionAltitude": "Höhe",
+ "positionSpeed": "Geschwindigkeit",
+ "positionCourse": "Richtung",
+ "positionAddress": "Adresse",
+ "positionProtocol": "Protokoll",
+ "positionDistance": "Distanz",
+ "positionRpm": "Drehzahl",
+ "positionFuel": "Treibstoff",
+ "positionPower": "Versorgungsspannung",
+ "positionBattery": "Batterie",
+ "positionRaw": "Roh",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelliten",
+ "positionSatVisible": "Sichtbare Satelliten",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Ereignis",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Kilometerzähler",
+ "positionServiceOdometer": "Kilometerzähler - Service",
+ "positionTripOdometer": "Kilometerzähler - Trip",
+ "positionHours": "Stunden",
+ "positionSteps": "Schritte",
+ "positionInput": "Input",
+ "positionHeartRate": "Herzfrequenz",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Batteriestand",
+ "positionFuelConsumption": "Kraftstoffverbrauch",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Zündung",
+ "positionFlags": "Flags",
+ "positionCharge": "Laden",
+ "positionIp": "IP",
+ "positionArchive": "Archiv",
+ "positionVin": "VIN",
+ "positionApproximate": "Geschätzt",
+ "positionThrottle": "Gasstellung",
+ "positionMotion": "Bewegung",
+ "positionArmed": "Gesichert",
+ "positionAcceleration": "Beschleunigung",
+ "positionTemp": "Temperatur",
+ "positionDeviceTemp": "Gerätetemperatur",
+ "positionCoolantTemp": "Kühlmitteltemperatur",
+ "positionOperator": "Netz",
+ "positionCommand": "Befehl",
+ "positionBlocked": "Blockiert",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Geschwindigkeit",
+ "positionObdOdometer": "OBD Kilometerzähler",
+ "positionDrivingTime": "Fahrzeit",
+ "positionDriverUniqueId": "Eindeutige ID des Fahrers",
+ "positionCard": "Karte",
+ "positionImage": "Bild",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Server Einstellungen",
+ "serverZoom": "Zoomen",
+ "serverRegistration": "Registrierung zulassen",
+ "serverReadonly": "Nur Lesen",
+ "serverForceSettings": "Einstellungen erzwingen",
+ "serverAnnouncement": "Ankündigung",
+ "serverName": "Server Name",
+ "serverDescription": "Server Beschreibung",
+ "serverColorPrimary": "Primäre Farbe",
+ "serverColorSecondary": "Sekundäre Farbe",
+ "serverLogo": "Logo",
+ "serverLogoInverted": "Umgekehrte Logografik",
+ "serverChangeDisable": "Serverwechsel deaktivieren",
+ "serverDisableShare": "Gerätefreigabe deaktivieren",
+ "mapTitle": "Karte",
+ "mapActive": "Aktive Karte",
+ "mapOverlay": "Karten Overlay",
+ "mapOverlayCustom": "Benutzerdefiniertes Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Wolken",
+ "mapOpenWeatherPrecipitation": "OpenWeather Niederschlag",
+ "mapOpenWeatherPressure": "OpenWeather Luftdruck",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperatur",
+ "mapLayer": "Karten Layer",
+ "mapCustom": "Benutzerdefiniert (XYZ)",
+ "mapCustomArcgis": "Benutzerdefiniert (ArcGIS)",
+ "mapCustomLabel": "Benutzerdefinierte Karte",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Straßen",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellit",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Strassenkarte",
+ "mapBingAerial": "Bing Luftbilder",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Material-Überwachung",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dunkel",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polygon",
+ "mapShapeCircle": "Kreis",
+ "mapShapePolyline": "Polylinie",
+ "mapLiveRoutes": "Live Route",
+ "mapDirection": "Richtung anzeigen",
+ "mapCurrentLocation": "Momentaner Standort",
+ "mapPoiLayer": "POI Ebene",
+ "mapClustering": "Marker zusammenfassen",
+ "mapOnSelect": "Karte bei Auswahl anzeigen",
+ "mapDefault": "Standartkarte",
+ "stateTitle": "Status",
+ "stateName": "Parameter",
+ "stateValue": "Wert",
+ "commandTitle": "Befehl",
+ "commandSend": "Senden",
+ "commandSent": "Befehl gesendet",
+ "commandQueued": "Befehl eingereiht",
+ "commandUnit": "Einheit",
+ "commandCustom": "Benutzerdefinierter Befehl",
+ "commandDeviceIdentification": "Gerätekennung",
+ "commandPositionSingle": "Einzelne Meldung",
+ "commandPositionPeriodic": "Regelmäßige Meldungen",
+ "commandPositionStop": "Meldungen beenden",
+ "commandEngineStop": "Motor gestoppt",
+ "commandEngineResume": "Motor gestartet",
+ "commandAlarmArm": "Scharf schalten",
+ "commandAlarmDisarm": "Unscharf schalten",
+ "commandAlarmDismiss": "Alarm abstellen",
+ "commandSetTimezone": "Zeitzone festlegen",
+ "commandRequestPhoto": "Foto anfordern",
+ "commandPowerOff": "Gerät ausschalten",
+ "commandRebootDevice": "Gerät neustarten",
+ "commandFactoryReset": "Zurücksetzen auf Werkseinstellungen",
+ "commandSendSms": "SMS senden",
+ "commandSendUssd": "USSD senden",
+ "commandSosNumber": "SOS-Nummer festlegen",
+ "commandSilenceTime": "Ruhezeit festlegen",
+ "commandSetPhonebook": "Telefonbuch festlegen",
+ "commandVoiceMessage": "Sprachnachricht",
+ "commandOutputControl": "Berichtsteuerung",
+ "commandVoiceMonitoring": "Stimmenmonitor",
+ "commandSetAgps": "AGPS einstellen",
+ "commandSetIndicator": "Blinker setzen",
+ "commandConfiguration": "Konfiguration",
+ "commandGetVersion": "Version abfragen",
+ "commandFirmwareUpdate": "Firmware upgraden",
+ "commandSetConnection": "Verbindung aufbauen",
+ "commandSetOdometer": "Kilometerzähler einstellen",
+ "commandGetModemStatus": "Modemstatus abrufen",
+ "commandGetDeviceStatus": "Gerätestatus abrufen",
+ "commandSetSpeedLimit": "Tempolimit einstellen",
+ "commandModePowerSaving": "Energiesparmodus",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Geozaun-Alarm einstellen",
+ "commandAlarmBattery": "Batterie-Alarm einstellen",
+ "commandAlarmSos": "SOS-Alarm einstellen",
+ "commandAlarmRemove": "Demontage-Alarm einstellen",
+ "commandAlarmClock": "Uhr-Alarm einstellen",
+ "commandAlarmSpeed": "Geschwinidkeits-Alarm einstellen",
+ "commandAlarmFall": "Sturz-Alarm einstellen",
+ "commandAlarmVibration": "Vibrations-Alarm einstellen",
+ "commandFrequency": "Frequenz",
+ "commandTimezone": "Zeitzonendifferenz",
+ "commandMessage": "Nachricht",
+ "commandRadius": "Radius",
+ "commandEnable": "Aktivieren",
+ "commandData": "Daten",
+ "commandIndex": "Index",
+ "commandPhone": "Rufnummer",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Alle Ereignisse",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unbekannt",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Gerät inaktiv",
+ "eventQueuedCommandSent": "Befehl in der Warteschlange senden",
+ "eventDeviceMoving": "Gerät in Bewegung",
+ "eventDeviceStopped": "Gerät gestoppt",
+ "eventDeviceOverspeed": "Tempolimit überschritten",
+ "eventDeviceFuelDrop": "Treibstoffleck",
+ "eventDeviceFuelIncrease": "Anstieg der Tankfüllung",
+ "eventCommandResult": "Ergebnis des Befehls",
+ "eventGeofenceEnter": "Geozaun betreten",
+ "eventGeofenceExit": "Geozaun verlassen",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Zündung an",
+ "eventIgnitionOff": "Zündung aus",
+ "eventMaintenance": "Wartung erforderlich",
+ "eventTextMessage": "Textnachricht empfangen",
+ "eventDriverChanged": "Fahrer gewechselt",
+ "eventMedia": "Medien",
+ "eventsScrollToLast": "Zur Neuesten scrollen",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarme",
+ "alarmGeneral": "Allgemein",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Bewegung",
+ "alarmLowspeed": "Geringe Geschwindigkeit",
+ "alarmOverspeed": "Geschwindigkeitsüberschreitung",
+ "alarmFallDown": "Sturz",
+ "alarmLowPower": "Geringe Spannung",
+ "alarmLowBattery": "Geringer Batteriestand",
+ "alarmFault": "Fehler",
+ "alarmPowerOff": "Ausschalten",
+ "alarmPowerOn": "Einschalten",
+ "alarmDoor": "Tür",
+ "alarmLock": "Sperren",
+ "alarmUnlock": "Entsperren",
+ "alarmGeofence": "Geozaun",
+ "alarmGeofenceEnter": "Geozaun betreten",
+ "alarmGeofenceExit": "Geofence verlassen",
+ "alarmGpsAntennaCut": "GPS Antenne entfernt",
+ "alarmAccident": "Unfall",
+ "alarmTow": "Abschleppen",
+ "alarmIdle": "Ruhezustand",
+ "alarmHighRpm": "Hohe Drehzahl",
+ "alarmHardAcceleration": "Starke Beschleunigung",
+ "alarmHardBraking": "Starkes Bremsen",
+ "alarmHardCornering": "Scharfes Kurvenfahren",
+ "alarmLaneChange": "Spurwechsel",
+ "alarmFatigueDriving": "Müdigkeitserkennung",
+ "alarmPowerCut": "Stromversorgung unterbrochen",
+ "alarmPowerRestored": "Stromversorgung wiederhergestellt",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperatur",
+ "alarmParking": "Parken",
+ "alarmBonnet": "Haube",
+ "alarmFootBrake": "Betriebsbremse",
+ "alarmFuelLeak": "Treibstoffleck",
+ "alarmTampering": "Manipulation",
+ "alarmRemoving": "Entfernen",
+ "notificationType": "Art der Benachrichtigung",
+ "notificationAlways": "Alle Geräte",
+ "notificationNotificators": "Kanäle",
+ "notificatorCommand": "Befehl",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Abspielen",
+ "reportCombined": "Kombiniert",
+ "reportRoute": "Route",
+ "reportEvents": "Ereignis",
+ "reportTrips": "Fahrten",
+ "reportStops": "Stopps",
+ "reportSummary": "Zusammenfassung",
+ "reportDaily": "tägliche Übersicht",
+ "reportChart": "Diagramm",
+ "reportConfigure": "Konfigurieren",
+ "reportEventTypes": "Ereignisarten",
+ "reportChartType": "Diagramm Typ",
+ "reportShowMarkers": "Zeige Markierungen",
+ "reportExport": "Export",
+ "reportEmail": "E-Mail Report",
+ "reportSchedule": "Planen",
+ "reportPeriod": "Zeitraum",
+ "reportCustom": "Eigene",
+ "reportToday": "Heute",
+ "reportYesterday": "Gestern",
+ "reportThisWeek": "Diese Woche",
+ "reportPreviousWeek": "Letzte Woche",
+ "reportThisMonth": "Dieser Monat",
+ "reportPreviousMonth": "Letzer Monat",
+ "reportDeviceName": "Gerätename",
+ "reportAverageSpeed": "Durchschnittsgeschwindigkeit",
+ "reportMaximumSpeed": "Höchstgeschwindigkeit",
+ "reportEngineHours": "Betriebsstunden",
+ "reportDuration": "Dauer",
+ "reportStartDate": "Beginn",
+ "reportStartTime": "Startzeit",
+ "reportStartAddress": "Startort",
+ "reportEndTime": "Zielzeit",
+ "reportEndAddress": "Zielort",
+ "reportSpentFuel": "Kraftstoffverbrauch",
+ "reportStartOdometer": "Kilometerstand Start",
+ "reportEndOdometer": "Kilometerstand Ende",
+ "statisticsTitle": "Statistiken",
+ "statisticsCaptureTime": "Zeitpunkt",
+ "statisticsActiveUsers": "Aktive Benutzer",
+ "statisticsActiveDevices": "Aktive Geräte",
+ "statisticsRequests": "Anfragen",
+ "statisticsMessagesReceived": "Empfangene Nachrichten",
+ "statisticsMessagesStored": "Gespeicherte Nachrichten",
+ "statisticsGeocoder": "Geocoder Anfragen",
+ "statisticsGeolocation": "Geolocation Anfragen",
+ "categoryArrow": "Pfeil",
+ "categoryDefault": "Standard",
+ "categoryAnimal": "Tier",
+ "categoryBicycle": "Fahrrad",
+ "categoryBoat": "Boot",
+ "categoryBus": "Bus",
+ "categoryCar": "Auto",
+ "categoryCamper": "Wohnmobil",
+ "categoryCrane": "Kran",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motorrad",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Flugzeug",
+ "categoryShip": "Schiff",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Zug",
+ "categoryTram": "Straßenbahn",
+ "categoryTrolleybus": "Oberleitungsbus",
+ "categoryTruck": "LKW",
+ "categoryVan": "Van",
+ "categoryScooter": "Roller",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Periode"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/el.json b/legacy/web/l10n/el.json
new file mode 100644
index 00000000..ad2f2cf1
--- /dev/null
+++ b/legacy/web/l10n/el.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Φόρτωση...",
+ "sharedHide": "Απόκρυψη",
+ "sharedSave": "Αποθήκευση",
+ "sharedUpload": "Upload",
+ "sharedSet": "Θέσε",
+ "sharedCancel": "Άκυρο",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Προσθήκη",
+ "sharedEdit": "Επεξεργασία",
+ "sharedRemove": "Διαγραφή",
+ "sharedRemoveConfirm": "Διαγραφη στοιχείου;",
+ "sharedNoData": "Χωρίς δεδομένα",
+ "sharedSubject": "Subject",
+ "sharedYes": "Ναι",
+ "sharedNo": "Όχι",
+ "sharedKm": "χλμ",
+ "sharedMi": "μίλια",
+ "sharedNmi": "nmi",
+ "sharedMeters": "μ.",
+ "sharedFeet": "ft",
+ "sharedKn": "κόμβοι",
+ "sharedKmh": "χλμ/ώρα",
+ "sharedMph": "μίλια/ώρα",
+ "sharedHour": "Ώρα",
+ "sharedMinute": "Λεπτά",
+ "sharedSecond": "Δευτερόλεπτα",
+ "sharedDays": "ημέρες",
+ "sharedHours": "ώρες",
+ "sharedMinutes": "λεπτά",
+ "sharedDecimalDegrees": "Μοίρες",
+ "sharedDegreesDecimalMinutes": "Λεπτά μοίρας",
+ "sharedDegreesMinutesSeconds": "Δεύτερα μοίρας",
+ "sharedName": "Όνομα",
+ "sharedDescription": "Περιγραφή",
+ "sharedSearch": "Αναζήτηση",
+ "sharedIconScale": "Κλίμακα εικονιδίων",
+ "sharedGeofence": "Γεωφράχτης",
+ "sharedGeofences": "Γεωφράχτες",
+ "sharedCreateGeofence": "Δημιουργήστε Γεώφραγμα",
+ "sharedNotifications": "Ειδοποιήσεις",
+ "sharedNotification": "Ειδοποίηση",
+ "sharedAttributes": "Παράμετροι",
+ "sharedAttribute": "Παράμετρος",
+ "sharedDrivers": "Οδηγοί",
+ "sharedDriver": "Οδηγός",
+ "sharedArea": "Περιοχή",
+ "sharedSound": "Ήχος ειδοποίησης",
+ "sharedType": "Τύπος",
+ "sharedDistance": "Απόσταση",
+ "sharedHourAbbreviation": "ώ",
+ "sharedMinuteAbbreviation": "λ",
+ "sharedSecondAbbreviation": "δ",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "γαλόνι",
+ "sharedLiter": "Λίτρο",
+ "sharedImpGallon": "Γαλόνι Αγγλικό",
+ "sharedUsGallon": "Γαλόνι ΗΠΑ",
+ "sharedLiterPerHourAbbreviation": "λ/ώ",
+ "sharedGetMapState": "Λήψη κατάστασης χάρτη",
+ "sharedComputedAttribute": "Υπολογισμένο χαρακτηριστικό",
+ "sharedComputedAttributes": "Υπολογισμένα χαρακτηριστικά",
+ "sharedCheckComputedAttribute": "Ελέξτε την υπολογισμένη ιδιότητα",
+ "sharedExpression": "Έκφραση",
+ "sharedDevice": "Συσκευή",
+ "sharedTest": "Δοκιμή",
+ "sharedTestNotification": "Αποστολή δοκιμαστικής ειδοποίησης",
+ "sharedTestNotificators": "Δοκιμή καναλιών",
+ "sharedTestExpression": "Δοκιμή Διατύπωσης",
+ "sharedCalendar": "Ημερολόγιο",
+ "sharedCalendars": "Ημερολόγια",
+ "sharedFile": "Αρχείο",
+ "sharedSearchDevices": "Αναζήτηση συσκευών",
+ "sharedSortBy": "Ταξινόμηση κατά",
+ "sharedFilterMap": "Φίλτρο στον χάρτη",
+ "sharedSelectFile": "Επιλογή αρχείου",
+ "sharedPhone": "Τηλέφωνο",
+ "sharedRequired": "Απαραίτητο",
+ "sharedPreferences": "Προτιμήσεις",
+ "sharedPermissions": "Άδειες",
+ "sharedConnections": "Συνδέσεις",
+ "sharedExtra": "Επιπλέον",
+ "sharedPrimary": "Πρωτεύον",
+ "sharedSecondary": "Δευτερεύον",
+ "sharedTypeString": "Αλφαριθμητικό",
+ "sharedTypeNumber": "Αριθμός",
+ "sharedTypeBoolean": "Αληθές/Ψευδές",
+ "sharedTimezone": "Ζώνη ώρας",
+ "sharedInfoTitle": "Πληροφορίες",
+ "sharedSavedCommand": "Αποθηκευμένη Εντολή",
+ "sharedSavedCommands": "Αποθηκευμένες Εντολές",
+ "sharedNew": "Νέο...",
+ "sharedShowAddress": "Δείξε Διεύθυνση",
+ "sharedShowDetails": "Περισσότερες λεπτομέρειες",
+ "sharedDisabled": "Απενεργοποιημένο",
+ "sharedMaintenance": "Συντήρηση",
+ "sharedDeviceAccumulators": "Συσσωρευτές",
+ "sharedAlarms": "Συναγερμοί",
+ "sharedLocation": "Τοποθεσία",
+ "sharedImport": "Εισαγωγή",
+ "sharedColumns": "Στήλες",
+ "sharedDropzoneText": "Σύρετε και αποθέστε ένα αρχείο εδώ ή κάντε κλικ",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Απλό",
+ "calendarRecurrence": "Επανάληψη",
+ "calendarOnce": "Μια φορά",
+ "calendarDaily": "Καθημερινά",
+ "calendarWeekly": "Εβδομαδιαία",
+ "calendarMonthly": "Μηνιαίο",
+ "calendarDays": "Ημέρες",
+ "calendarSunday": "Κυριακή",
+ "calendarMonday": "Δευτέρα",
+ "calendarTuesday": "Τρίτη",
+ "calendarWednesday": "Τετάρτη",
+ "calendarThursday": "Πέμπτη",
+ "calendarFriday": "Παρασκευή",
+ "calendarSaturday": "Σάββατο",
+ "attributeShowGeofences": "Εμφάνιση γεωφραγμάτων",
+ "attributeSpeedLimit": "Όριο ταχύτητας",
+ "attributeFuelDropThreshold": "Όριο πτώσης καυσίμου",
+ "attributeFuelIncreaseThreshold": "Όριο αύξησης καυσίμου",
+ "attributePolylineDistance": "Πολυγραμμική Απόσταση",
+ "attributeReportIgnoreOdometer": "Αναφορά: Αγνόηση οδομέτρου",
+ "attributeWebReportColor": "Διαδίκτυο: Χρώμα Αναφοράς",
+ "attributeDevicePassword": "Κωδικός συσκευής",
+ "attributeDeviceImage": "Εικόνα συσκευής",
+ "attributeDeviceInactivityStart": "Αρχή αδράνειας συσκευής",
+ "attributeDeviceInactivityPeriod": "Περίοδος αδράνειας συσκευής",
+ "attributeProcessingCopyAttributes": "Επεξεργασία: Αντιγραφή Ιδιοτήτων",
+ "attributeColor": "Χρώμα",
+ "attributeWebLiveRouteLength": "Ιστός: Μήκος Ζωντανής Διαδρομής",
+ "attributeWebSelectZoom": "Ιστός: Επιλογή μεγέθυνσης",
+ "attributeWebMaxZoom": "Διαδίκτυο: Μέγιστη Μεγέθυνση",
+ "attributeTelegramChatId": "Αναγνωριστικό συνομιλίας Telegram",
+ "attributePushoverUserKey": "Κλειδί χρήστη Pushover",
+ "attributePushoverDeviceNames": "Ονόματα συσκευών Pushover",
+ "attributeMailSmtpHost": "Αλληλογραφία: Εξυπηρετητής SMTP",
+ "attributeMailSmtpPort": "Αλληλογραφία: Θύρα SMTP",
+ "attributeMailSmtpStarttlsEnable": "Αλληλογραφία: Ενεργοποίηση SMTP STARTLLS",
+ "attributeMailSmtpStarttlsRequired": "Αλληλογραφία: Απαιτούμενο SMTP STARTLLS",
+ "attributeMailSmtpSslEnable": "Αλληλογραφία: Ενεργοποίηση SMTP SSL",
+ "attributeMailSmtpSslTrust": "Αλληλογραφία: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Αλληλογραφία: SMTP SSL Πρωτόκολλα",
+ "attributeMailSmtpFrom": "Αλληλογραφία: SMTP Από",
+ "attributeMailSmtpAuth": "Αλληλογραφία: Ενεργοποίηση Πιστοποίησης SMTP",
+ "attributeMailSmtpUsername": "Αλληλογραφία: Κωδικός SMTP",
+ "attributeMailSmtpPassword": "Αλληλογραφία: SMTP Συνθηματικό",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "Διεπαφή: Απενεργοποίηση χαρακτηριστικών",
+ "attributeUiDisableGroups": "Διεπαφή: Απενεργοποίηση ομάδων",
+ "attributeUiDisableEvents": "Διεπαφή: Απενεργοποίηση Γεγονότων",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "Διεπαφή: Απενεργοποίηση Οδηγών",
+ "attributeUiDisableComputedAttributes": "Διεπαφή: Απενεργοποίηση Υπολογισμένων Ιδιοτήτων",
+ "attributeUiDisableCalendars": "Διεπαφή: Απενεργοποίηση Ημερολογίων",
+ "attributeUiDisableMaintenance": "Διεπαφή: Απενεργοποίηση συντήρησης",
+ "attributeUiHidePositionAttributes": "Διεπαφή: Απόκρυψη Ιδιοτήτων Θέσης",
+ "attributeUiDisableLoginLanguage": "Διεπαφή: Απενεργοποίηση γλώσσας σύνδεσης",
+ "attributeNotificationTokens": "Διακριτικά ειδοποίησης",
+ "attributePopupInfo": "Αναδυόμενη πληροφορία",
+ "errorTitle": "Σφάλμα",
+ "errorGeneral": "Μη έγκυρες παράμετροι ή παραβίαση περιορισμών",
+ "errorConnection": "Σφάλμα σύνδεσης",
+ "errorSocket": "Σφάλμα σύνδεσης στο διαδίκτυο",
+ "errorZero": "Δεν μπορεί να είναι μηδέν",
+ "userEmail": "Ηλ. διεύθυνση",
+ "userPassword": "Συνθηματικό",
+ "userAdmin": "Διαχειριστής",
+ "userRemember": "Απομνημόνευση",
+ "userExpirationTime": "Λήξη",
+ "userDeviceLimit": "Όριο συσκευής",
+ "userUserLimit": "Όριο χρήστη",
+ "userDeviceReadonly": "Συσκευή μόνο για Ανάγνωση",
+ "userLimitCommands": "Όριο Εντολών",
+ "userDisableReports": "Απανεργοποίηση αναφορών",
+ "userFixedEmail": "Δεν επιτρέπεται η αλλαγή email",
+ "userToken": "Λεκτικό",
+ "userDeleteAccount": "Διαγραφή λογαριασμού",
+ "userTemporary": "Temporary",
+ "loginTitle": "Σύνδεση",
+ "loginLanguage": "Γλώσσα",
+ "loginReset": "Επαναφορά κωδικού",
+ "loginRegister": "Εγγραφή",
+ "loginLogin": "Σύνδεση",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Εσφαλμένη διεύθυνση ή εσφαλμένο συνθηματικό",
+ "loginCreated": "Ο νέος χρήστης καταχωρήθηκε.",
+ "loginResetSuccess": "Ελέγξτε τα email σας",
+ "loginUpdateSuccess": "Το νέο συνθηματικό αποθηκεύθηκε",
+ "loginLogout": "Αποσύνδεση",
+ "loginLogo": "Λογότυπο",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Κατάσταση συσκευών",
+ "deviceSelected": "Επιλεγμένη συσκευή",
+ "deviceTitle": "Συσκευές",
+ "devicePrimaryInfo": "Τίτλος συσκευής",
+ "deviceSecondaryInfo": "Λεπτομέρεια συσκευής",
+ "deviceIdentifier": "Αναγνωριστικό",
+ "deviceModel": "Μοντέλο",
+ "deviceContact": "Επαφή",
+ "deviceCategory": "Κατηγορία",
+ "deviceLastUpdate": "Τελευταία ενημέρωση",
+ "deviceCommand": "Εντολή",
+ "deviceFollow": "Ακολουθώ",
+ "deviceTotalDistance": "Συνολική απόσταση",
+ "deviceStatus": "Κατάσταση",
+ "deviceStatusOnline": "Σε σύνδεση",
+ "deviceStatusOffline": "Χωρίς σύνδεση",
+ "deviceStatusUnknown": "Άγνωστο",
+ "deviceRegisterFirst": "Καταχωρίστε την πρώτη σας συσκευή",
+ "deviceIdentifierHelp": "IMEI, σειριακός αριθμός ή άλλο αναγνωριστικό. Πρέπει να ταιριάζει με τις αναφορές της συσκευής στον διακομιστή.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Ομάδα",
+ "groupParent": "Ομάδα",
+ "groupNoGroup": "Χωρίς Ομάδα",
+ "settingsTitle": "Ρυθμίσεις",
+ "settingsUser": "Λογαριασμός",
+ "settingsGroups": "Ομάδες",
+ "settingsServer": "Εξυπηρετητής",
+ "settingsUsers": "Χρήστες",
+ "settingsDistanceUnit": "Μονάδα Απόστασης",
+ "settingsAltitudeUnit": "Υψομετρική Μονάδα",
+ "settingsSpeedUnit": "Μονάδα Ταχύτητας",
+ "settingsVolumeUnit": "Μονάδα Όγκου",
+ "settingsTwelveHourFormat": "12ώρη μορφή",
+ "settingsCoordinateFormat": "Τύπος Συντεταγμένων",
+ "settingsServerVersion": "Έκδοση διακομιστή",
+ "settingsAppVersion": "Έκδοση εφαρμογής",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Αναφορές",
+ "reportScheduled": "Προγραμματισμένες αναφορές",
+ "reportDevice": "Συσκευή",
+ "reportGroup": "Ομάδα",
+ "reportFrom": "Από",
+ "reportTo": "Έως",
+ "reportShow": "Προβολή",
+ "reportClear": "Καθαρισμός",
+ "linkGoogleMaps": "Χάρτες Google",
+ "linkAppleMaps": "Χάρτες Apple",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Διόρθωση χρόνου",
+ "positionDeviceTime": "Χρόνος συσκευής",
+ "positionServerTime": "Χρόνος Διακομιστή",
+ "positionValid": "Έγκυρο",
+ "positionAccuracy": "Ακρίβεια",
+ "positionLatitude": "Γ. πλάτος",
+ "positionLongitude": "Γ. μήκος",
+ "positionAltitude": "Υψόμετρο",
+ "positionSpeed": "Ταχύτητα",
+ "positionCourse": "Πορεία",
+ "positionAddress": "Διεύθυνση",
+ "positionProtocol": "Πρωτόκολλο",
+ "positionDistance": "Απόσταση",
+ "positionRpm": "ΣΑΛ",
+ "positionFuel": "Καύσιμο",
+ "positionPower": "Ισχύς",
+ "positionBattery": "Συσσωρευτής",
+ "positionRaw": "Ακατέργαστο",
+ "positionIndex": "Δείκτης",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Δορυφόροι",
+ "positionSatVisible": "Ορατοί Δορυφόροι",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Περιαγωγή",
+ "positionEvent": "Γεγονός",
+ "positionAlarm": "Συναγερμός",
+ "positionStatus": "Κατάσταση",
+ "positionOdometer": "Οδόμετρο",
+ "positionServiceOdometer": "Οδόμετρο Σέρβις",
+ "positionTripOdometer": "Οδόμετρο Διαδρομής",
+ "positionHours": "Ώρες",
+ "positionSteps": "Βήματα",
+ "positionInput": "Είσοδος",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Έξοδος",
+ "positionBatteryLevel": "Επίπεδο Συσσωρευτή",
+ "positionFuelConsumption": "Κατανάλωση καυσίμου",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Έκδοση λογισμικού",
+ "positionVersionHw": "Έκδοση υλικού",
+ "positionIgnition": "Ανάφλεξη",
+ "positionFlags": "Σημαίες",
+ "positionCharge": "Φόρτιση",
+ "positionIp": "IP",
+ "positionArchive": "Αρχείο",
+ "positionVin": "VIN",
+ "positionApproximate": "Κατά προσέγγιση",
+ "positionThrottle": "Γκάζι",
+ "positionMotion": "Κίνηση",
+ "positionArmed": "Οπλισμένο",
+ "positionAcceleration": "Επιτάχυνση",
+ "positionTemp": "Θερμοκρασία",
+ "positionDeviceTemp": "Θερμοκρασία συσκευής",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Χειριστής",
+ "positionCommand": "Εντολή",
+ "positionBlocked": "Αποκλεισμένο",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Ταχύτητα OBD",
+ "positionObdOdometer": "Χιλιομετρητής OBD",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Αναγνωριστικό οδηγού",
+ "positionCard": "Card",
+ "positionImage": "Εικόνα",
+ "positionVideo": "Βίντεο",
+ "positionAudio": "Ήχος",
+ "serverTitle": "Ρυθμίσεις εξυπηρετητή",
+ "serverZoom": "Εστίαση",
+ "serverRegistration": "Εγγραφή",
+ "serverReadonly": "Μόνο για ανάγνωση",
+ "serverForceSettings": "Επιβολή ρυθμίσεων",
+ "serverAnnouncement": "Αναγγελία",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Χάρτης",
+ "mapActive": "Ενεργοί Χάρτες",
+ "mapOverlay": "Υπέρθεση Χάρτη",
+ "mapOverlayCustom": "Προσαρμοσμένη Υπέρθεση",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Επιλογή χάρτη",
+ "mapCustom": "Προσαρμοσμένο (XYZ)",
+ "mapCustomArcgis": "Προσαρμοσμένο (ArcGIS)",
+ "mapCustomLabel": "Προσαρμοσμένος χάρτης",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "OpenTopoMap",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Κλειδί Bing Maps",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Χαρτογραφική υπηρεσία",
+ "mapMapboxStreets": "Οδικός Mapbox",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Υπαίθριος Mapbox",
+ "mapMapboxSatellite": "Δορυφορικός Mapbox",
+ "mapMapboxKey": "Mapbox Διακριτικό Πρόσβασης",
+ "mapMapTilerBasic": "Βασικός MapTiler",
+ "mapMapTilerHybrid": "Υβριδικός MapTiler",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "Οδική ΤοποθεσίαIQ",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Πολύγωνο",
+ "mapShapeCircle": "Κύκλος",
+ "mapShapePolyline": "Πολύγραμμο",
+ "mapLiveRoutes": "Ζωντανές διαδρομές",
+ "mapDirection": "Εμφάνιση κατεύθυνσης",
+ "mapCurrentLocation": "Τρέχουσα τοποθεσία",
+ "mapPoiLayer": "Επίπεδο POI",
+ "mapClustering": "Ομαδοποίηση δεικτών",
+ "mapOnSelect": "Εμφάνιση χάρτη κατά την επιλογή",
+ "mapDefault": "Προεπιλεγμένος χάρτης",
+ "stateTitle": "Κατάσταση",
+ "stateName": "Παράμετρος",
+ "stateValue": "Τιμή",
+ "commandTitle": "Εντολή",
+ "commandSend": "Αποστολή",
+ "commandSent": "Εντολή εστάλη",
+ "commandQueued": "Εντολή σε ουρά",
+ "commandUnit": "Μονάδα",
+ "commandCustom": "Προσαρμοσμένη εντολή",
+ "commandDeviceIdentification": "Αναγνωριστικό συσκευής",
+ "commandPositionSingle": "Ενιαία αναφορά",
+ "commandPositionPeriodic": "Περιοδικές αναφορές",
+ "commandPositionStop": "Λήξη αναφορών",
+ "commandEngineStop": "Κλείσιμο",
+ "commandEngineResume": "Επανεκκίνηση",
+ "commandAlarmArm": "Ενεργοποίηση συναγερμού",
+ "commandAlarmDisarm": "Απενεργοποίηση συναγερμού",
+ "commandAlarmDismiss": "Απενεργοποίηση συναγερμού",
+ "commandSetTimezone": "Καθορισμός ζώνης ώρας",
+ "commandRequestPhoto": "Αίτημα για φωτογραφία",
+ "commandPowerOff": "Απενεργοποίηση συσκευής",
+ "commandRebootDevice": "Επανεκκίνηση συσκευής",
+ "commandFactoryReset": "Επαναφορά εργοστασιακών ρυθμίσεων",
+ "commandSendSms": "Αποστολή γραπτού μηνύματος (SMS)",
+ "commandSendUssd": "Αποστολή USSD",
+ "commandSosNumber": "Καθορισμός αριθμού SOS",
+ "commandSilenceTime": "Καθορισμός χρόνου σιωπής",
+ "commandSetPhonebook": "Καθορισμός τηλεφωνικού καταλόγου",
+ "commandVoiceMessage": "Φωνητικό μήνυμα",
+ "commandOutputControl": "Έλεγχος αποτελεσμάτων",
+ "commandVoiceMonitoring": "Παρακολούθηση Φωνής",
+ "commandSetAgps": "Ρύθμιση AGPS",
+ "commandSetIndicator": "Θέσε Δείκτη",
+ "commandConfiguration": "Διαμόρφωση",
+ "commandGetVersion": "Λήψη Έκδοσης",
+ "commandFirmwareUpdate": "Ενημέρωση λογισμικού",
+ "commandSetConnection": "Θέσε Σύνδεση",
+ "commandSetOdometer": "Θέσε Οδόμετρο",
+ "commandGetModemStatus": "Λήψη Κατάσταση Αποδιαμορφωτή",
+ "commandGetDeviceStatus": "Λήψη Κατάστασης Συσκευής",
+ "commandSetSpeedLimit": "Ρύθμιση ορίου ταχύτητας",
+ "commandModePowerSaving": "Λειτουργία εξοικονόμησης ενέργειας",
+ "commandModeDeepSleep": "Λειτουργία βαθύ ύπνου",
+ "commandAlarmGeofence": "Ρύθμιση συναγερμού Geofence",
+ "commandAlarmBattery": "Ρύθμιση συναγερμού μπαταρίας",
+ "commandAlarmSos": "Ρύθμιση συναγερμού SOS",
+ "commandAlarmRemove": "Ρύθμιση αφαίρεσης συναγερμού",
+ "commandAlarmClock": "Ρύθμιση ξυπνητηριού",
+ "commandAlarmSpeed": "Ρύθμιση συναγερμού ταχύτητας",
+ "commandAlarmFall": "Ρύθμιση συναγερμού πτώσης",
+ "commandAlarmVibration": "Ρύθμιση συναγερμού κραδασμών",
+ "commandFrequency": "Συχνότητα",
+ "commandTimezone": "Μετατόπιση ζώνης ώρας",
+ "commandMessage": "Μήνυμα",
+ "commandRadius": "Ακτίνα",
+ "commandEnable": "Ενεργοποίηση",
+ "commandData": "Δεδομένα",
+ "commandIndex": "Δείκτης",
+ "commandPhone": "Τηλεφωνικός αριθμός",
+ "commandServer": "Εξυπηρετητής",
+ "commandPort": "Θύρα",
+ "eventAll": "Όλα τα γεγονότα",
+ "eventDeviceOnline": "Κατάσταση σε σύνδεση",
+ "eventDeviceUnknown": "Άγνωστη κατάσταση",
+ "eventDeviceOffline": "Κατάσταση εκτός σύνδεσης",
+ "eventDeviceInactive": "Αδρανής συσκευή",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Συσκευή εν κινήσει",
+ "eventDeviceStopped": "Συσκευή σε στάση",
+ "eventDeviceOverspeed": "Υπέρβαση ορίου ταχύτητας",
+ "eventDeviceFuelDrop": "Πτώση καυσίμων",
+ "eventDeviceFuelIncrease": "Αύξηση καυσίμου",
+ "eventCommandResult": "Αποτέλεσμα εντολής",
+ "eventGeofenceEnter": "Είσοδος σε γεωφράκτη",
+ "eventGeofenceExit": "Έξοδος από γεωφράκτη",
+ "eventAlarm": "Συναγερμός",
+ "eventIgnitionOn": "Μηχανή αναμμένη",
+ "eventIgnitionOff": "Μηχανή σβηστή",
+ "eventMaintenance": "Απαιτείται συντήρηση",
+ "eventTextMessage": "Ελήφθη γραπτό μήνυμα",
+ "eventDriverChanged": "Ο οδηγός άλλαξε",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Κύλιση στο τέλος",
+ "eventsSoundEvents": "Ήχοι Ειδοποιήσεων",
+ "eventsSoundAlarms": "Ήχοι Συναγερμού",
+ "alarmGeneral": "Γενικά",
+ "alarmSos": "SOS",
+ "alarmVibration": "Δόνηση",
+ "alarmMovement": "Κίνηση",
+ "alarmLowspeed": "Χαμηλή ταχύτητα",
+ "alarmOverspeed": "Υπέρβαση ορίου ταχύτητας",
+ "alarmFallDown": "Πτώση",
+ "alarmLowPower": "Χαμηλή ισχύς",
+ "alarmLowBattery": "Χαμηλή μπαταρία",
+ "alarmFault": "Σφάλμα",
+ "alarmPowerOff": "Απενεργοποίηση",
+ "alarmPowerOn": "Ενεργοποίηση",
+ "alarmDoor": "Πόρτα",
+ "alarmLock": "Κλείδωμα",
+ "alarmUnlock": "Ξεκλείδωμα",
+ "alarmGeofence": "Γεωφράκτης",
+ "alarmGeofenceEnter": "Είσοδος σε γεωφράκτη",
+ "alarmGeofenceExit": "Είσοδος από γεωφράκτη",
+ "alarmGpsAntennaCut": "Αποκοπή κεραίας GPS",
+ "alarmAccident": "Ατύχημα",
+ "alarmTow": "Ρυμούλκηση",
+ "alarmIdle": "Αδρανές",
+ "alarmHighRpm": "Υψηλές στροφές μηχανής",
+ "alarmHardAcceleration": "Απότομη επιτάχυνση",
+ "alarmHardBraking": "Απότομο φρενάρισμα",
+ "alarmHardCornering": "Απότομο στρίψιμο",
+ "alarmLaneChange": "Αλλαγή λωρίδας",
+ "alarmFatigueDriving": "Κόπωση Οδήγησης",
+ "alarmPowerCut": "Απώλεια ενέργειας",
+ "alarmPowerRestored": "Ισχύς αποκαταστάθηκε",
+ "alarmJamming": "Παρεμβολές",
+ "alarmTemperature": "Θερμοκρασία",
+ "alarmParking": "Στάθμευση",
+ "alarmBonnet": "Καπό",
+ "alarmFootBrake": "Ποδόφρενο",
+ "alarmFuelLeak": "Διαρροή καυσίμου",
+ "alarmTampering": "Παραποίηση",
+ "alarmRemoving": "Αφαίρεση",
+ "notificationType": "Τύπος ειδοποίησης",
+ "notificationAlways": "Όλες οι συσκευές",
+ "notificationNotificators": "Κανάλια",
+ "notificatorCommand": "Εντολή",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Επανάληψη",
+ "reportCombined": "Σε συνδυασμό",
+ "reportRoute": "Διαδρομή",
+ "reportEvents": "Γεγονότα",
+ "reportTrips": "Ταξίδια",
+ "reportStops": "Στάσεις",
+ "reportSummary": "Περίληψη",
+ "reportDaily": "Επισκόπιση ημέρας",
+ "reportChart": "Διάγραμμα",
+ "reportConfigure": "Διαμόρφωση",
+ "reportEventTypes": "Tύποι γεγονότος",
+ "reportChartType": "Τύπος διαγράμματος",
+ "reportShowMarkers": "Δείξε Δείκτες",
+ "reportExport": "Εξαγωγή",
+ "reportEmail": "Αποστολή αναφοράς με email",
+ "reportSchedule": "Πρόγραμμα",
+ "reportPeriod": "Περίοδος",
+ "reportCustom": "Προσαρμοσμένος",
+ "reportToday": "Σήμερα",
+ "reportYesterday": "Χθες",
+ "reportThisWeek": "Τρέχουσα Εβδομάδα",
+ "reportPreviousWeek": "Προηγούμενη Εβδομάδα",
+ "reportThisMonth": "Τρέχων Μήνας",
+ "reportPreviousMonth": "Προηγούμενος Μήνας",
+ "reportDeviceName": "Όνομα συσκευής",
+ "reportAverageSpeed": "Μέση ταχύτητα",
+ "reportMaximumSpeed": "Μέγιστη ταχύτητα",
+ "reportEngineHours": "Ώρες Μηχανής",
+ "reportDuration": "Διάρκεια",
+ "reportStartDate": "Ημερομηνία έναρξης",
+ "reportStartTime": "Ώρα έναρξης",
+ "reportStartAddress": "Διεύθυνση αφετηρίας",
+ "reportEndTime": "Ώρα λήξης",
+ "reportEndAddress": "Διεύθυνση τερματισμού",
+ "reportSpentFuel": "Κατανάλωση καυσίμων",
+ "reportStartOdometer": "Έναρξη χιλιομετρητή",
+ "reportEndOdometer": "Τέλος χιλιομετρητή",
+ "statisticsTitle": "Στατιστικά",
+ "statisticsCaptureTime": "Ώρα Καταγραφής",
+ "statisticsActiveUsers": "Ενεργοί Χρήστες",
+ "statisticsActiveDevices": "Ενεργές Συσκευές",
+ "statisticsRequests": "Αιτήματα",
+ "statisticsMessagesReceived": "Εισερχόμενα Μυνήματα",
+ "statisticsMessagesStored": "Αποθηκευμένα Μυνήματα",
+ "statisticsGeocoder": "Αιτήματα Γεωκωδικοποιητή",
+ "statisticsGeolocation": "Αιτήματα Γεωτοποθέτησης",
+ "categoryArrow": "Βέλος",
+ "categoryDefault": "Προκαθορισμένο",
+ "categoryAnimal": "Ζώο",
+ "categoryBicycle": "Ποδήλατο",
+ "categoryBoat": "Πλοίο",
+ "categoryBus": "Λεωφορείο",
+ "categoryCar": "Αυτοκίνητο",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Γερανός",
+ "categoryHelicopter": "Ελικόπτερο",
+ "categoryMotorcycle": "Μοτοσικλέτα",
+ "categoryOffroad": "Εκτός δρόμου",
+ "categoryPerson": "Άτομο",
+ "categoryPickup": "Αγροτικό",
+ "categoryPlane": "Αεροπλάνο",
+ "categoryShip": "Πλοίο",
+ "categoryTractor": "Ρυμουλκό",
+ "categoryTrain": "Τραίνο",
+ "categoryTram": "Τραμ",
+ "categoryTrolleybus": "Τρόλεϊ",
+ "categoryTruck": "Φορτηγό",
+ "categoryVan": "Κλειστό Φορτηγό",
+ "categoryScooter": "Σκούτερ",
+ "maintenanceStart": "Εκκίνηση",
+ "maintenancePeriod": "Περίοδος"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/en.json b/legacy/web/l10n/en.json
new file mode 100644
index 00000000..45b2552f
--- /dev/null
+++ b/legacy/web/l10n/en.json
@@ -0,0 +1,569 @@
+{
+ "sharedLoading": "Loading...",
+ "sharedHide": "Hide",
+ "sharedSave": "Save",
+ "sharedSet": "Set",
+ "sharedCancel": "Cancel",
+ "sharedAdd": "Add",
+ "sharedEdit": "Edit",
+ "sharedRemove": "Remove",
+ "sharedRemoveConfirm": "Remove item?",
+ "sharedNoData": "No data",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Hour",
+ "sharedMinute": "Minute",
+ "sharedSecond": "Second",
+ "sharedDays": "days",
+ "sharedHours": "hours",
+ "sharedMinutes": "minutes",
+ "sharedDecimalDegrees": "Decimal Degrees",
+ "sharedDegreesDecimalMinutes": "Degrees Decimal Minutes",
+ "sharedDegreesMinutesSeconds": "Degrees Minutes Seconds",
+ "sharedName": "Name",
+ "sharedDescription": "Description",
+ "sharedSearch": "Search",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geofence",
+ "sharedGeofences": "Geofences",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Notifications",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "Attributes",
+ "sharedAttribute": "Attribute",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
+ "sharedArea": "Area",
+ "sharedSound": "Notification Sound",
+ "sharedType": "Type",
+ "sharedDistance": "Distance",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Get Map State",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "Expression",
+ "sharedDevice": "Device",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send Test Notification",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Calendar",
+ "sharedCalendars": "Calendars",
+ "sharedFile": "File",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Select File",
+ "sharedPhone": "Phone",
+ "sharedRequired": "Required",
+ "sharedPreferences": "Preferences",
+ "sharedPermissions": "Permissions",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Number",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Timezone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Speed Limit",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Report: Ignore Odometer",
+ "attributeWebReportColor": "Web: Report Color",
+ "attributeDevicePassword": "Device Password",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "Color",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Error",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "Connection error",
+ "errorSocket": "Web socket connection error",
+ "errorZero": "Can't be zero",
+ "userEmail": "Email",
+ "userPassword": "Password",
+ "userAdmin": "Admin",
+ "userRemember": "Remember",
+ "userExpirationTime": "Expiration",
+ "userDeviceLimit": "Device Limit",
+ "userUserLimit": "User Limit",
+ "userDeviceReadonly": "Device Readonly",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "loginTitle": "Login",
+ "loginLanguage": "Language",
+ "loginReset": "Reset Password",
+ "loginRegister": "Register",
+ "loginLogin": "Login",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Incorrect email address or password",
+ "loginCreated": "New user has been registered",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Logout",
+ "loginLogo": "Logo",
+ "devicesAndState": "Devices and State",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Devices",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifier",
+ "deviceModel": "Model",
+ "deviceContact": "Contact",
+ "deviceCategory": "Category",
+ "deviceLastUpdate": "Last Update",
+ "deviceCommand": "Command",
+ "deviceFollow": "Follow",
+ "deviceTotalDistance": "Total Distance",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Unknown",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "groupDialog": "Group",
+ "groupParent": "Group",
+ "groupNoGroup": "No Group",
+ "settingsTitle": "Settings",
+ "settingsUser": "Account",
+ "settingsGroups": "Groups",
+ "settingsServer": "Server",
+ "settingsUsers": "Users",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "12-hour Format",
+ "settingsCoordinateFormat": "Coordinates Format",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "reportTitle": "Reports",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Device",
+ "reportGroup": "Group",
+ "reportFrom": "From",
+ "reportTo": "To",
+ "reportShow": "Show",
+ "reportClear": "Clear",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Valid",
+ "positionAccuracy": "Accuracy",
+ "positionLatitude": "Latitude",
+ "positionLongitude": "Longitude",
+ "positionAltitude": "Altitude",
+ "positionSpeed": "Speed",
+ "positionCourse": "Course",
+ "positionAddress": "Address",
+ "positionProtocol": "Protocol",
+ "positionDistance": "Distance",
+ "positionRpm": "RPM",
+ "positionFuel": "Fuel",
+ "positionPower": "Power",
+ "positionBattery": "Battery",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Event",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hours",
+ "positionSteps": "Steps",
+ "positionInput": "Input",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Battery Level",
+ "positionFuelConsumption": "Fuel Consumption",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Ignition",
+ "positionFlags": "Flags",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Motion",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Device Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Command",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Server Settings",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registration",
+ "serverReadonly": "Readonly",
+ "serverForceSettings": "Force Settings",
+ "serverAnnouncement": "Announcement",
+ "mapTitle": "Map",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Map Layer",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polygon",
+ "mapShapeCircle": "Circle",
+ "mapShapePolyline": "Polyline",
+ "mapLiveRoutes": "Live Routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "State",
+ "stateName": "Attribute",
+ "stateValue": "Value",
+ "commandTitle": "Command",
+ "commandSend": "Send",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "Unit",
+ "commandCustom": "Custom command",
+ "commandDeviceIdentification": "Device Identification",
+ "commandPositionSingle": "Single Reporting",
+ "commandPositionPeriodic": "Periodic Reporting",
+ "commandPositionStop": "Stop Reporting",
+ "commandEngineStop": "Engine Stop",
+ "commandEngineResume": "Engine Resume",
+ "commandAlarmArm": "Arm Alarm",
+ "commandAlarmDisarm": "Disarm Alarm",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Set Timezone",
+ "commandRequestPhoto": "Request Photo",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Reboot Device",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Send SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "Set SOS Number",
+ "commandSilenceTime": "Set Silence Time",
+ "commandSetPhonebook": "Set Phonebook",
+ "commandVoiceMessage": "Voice Message",
+ "commandOutputControl": "Output Control",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Set Indicator",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frequency",
+ "commandTimezone": "Timezone Offset",
+ "commandMessage": "Message",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Data",
+ "commandIndex": "Index",
+ "commandPhone": "Phone Number",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "All Events",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Command result",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Maintenance required",
+ "eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Type of Notification",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Route",
+ "reportEvents": "Events",
+ "reportTrips": "Trips",
+ "reportStops": "Stops",
+ "reportSummary": "Summary",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Chart",
+ "reportConfigure": "Configure",
+ "reportEventTypes": "Event Types",
+ "reportChartType": "Chart Type",
+ "reportShowMarkers": "Show Markers",
+ "reportExport": "Export",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "Device Name",
+ "reportAverageSpeed": "Average Speed",
+ "reportMaximumSpeed": "Maximum Speed",
+ "reportEngineHours": "Engine Hours",
+ "reportDuration": "Duration",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Start Time",
+ "reportStartAddress": "Start Address",
+ "reportEndTime": "End Time",
+ "reportEndAddress": "End Address",
+ "reportSpentFuel": "Spent Fuel",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Statistics",
+ "statisticsCaptureTime": "Capture Time",
+ "statisticsActiveUsers": "Active Users",
+ "statisticsActiveDevices": "Active Devices",
+ "statisticsRequests": "Requests",
+ "statisticsMessagesReceived": "Messages Received",
+ "statisticsMessagesStored": "Messages Stored",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Arrow",
+ "categoryDefault": "Default",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicycle",
+ "categoryBoat": "Boat",
+ "categoryBus": "Bus",
+ "categoryCar": "Car",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "Motorcycle",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Plane",
+ "categoryShip": "Ship",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Truck",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+}
diff --git a/legacy/web/l10n/es.json b/legacy/web/l10n/es.json
new file mode 100644
index 00000000..a0405eb1
--- /dev/null
+++ b/legacy/web/l10n/es.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Cargando…",
+ "sharedHide": "Ocultar",
+ "sharedSave": "Guardar",
+ "sharedUpload": "Cargar",
+ "sharedSet": "Establecer",
+ "sharedCancel": "Cancelar",
+ "sharedCopy": "Copiar",
+ "sharedAdd": "Añadir",
+ "sharedEdit": "Editar",
+ "sharedRemove": "Eliminar",
+ "sharedRemoveConfirm": "¿Eliminar elemento?",
+ "sharedNoData": "Sin datos",
+ "sharedSubject": "Asunto",
+ "sharedYes": "Si",
+ "sharedNo": "No",
+ "sharedKm": "Km",
+ "sharedMi": "MI",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "Nudos",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Hora",
+ "sharedMinute": "Minuto",
+ "sharedSecond": "Segundo",
+ "sharedDays": "Días",
+ "sharedHours": "Horas",
+ "sharedMinutes": "minutos",
+ "sharedDecimalDegrees": "Grados",
+ "sharedDegreesDecimalMinutes": "Minutos",
+ "sharedDegreesMinutesSeconds": "Segundos",
+ "sharedName": "Nombre",
+ "sharedDescription": "Descripción",
+ "sharedSearch": "Buscar",
+ "sharedIconScale": "Escala de los iconos",
+ "sharedGeofence": "Geo-Zona",
+ "sharedGeofences": "Geo-Zonas",
+ "sharedCreateGeofence": "Crear Geo-Zona",
+ "sharedNotifications": "Notificaciones",
+ "sharedNotification": "Notificación",
+ "sharedAttributes": "Atributos",
+ "sharedAttribute": "Atributo",
+ "sharedDrivers": "Conductores",
+ "sharedDriver": "Conductor",
+ "sharedArea": "Área",
+ "sharedSound": "Sonido de notificación",
+ "sharedType": "Tipo",
+ "sharedDistance": "Distancia",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "I",
+ "sharedGallonAbbreviation": "Galón",
+ "sharedLiter": "Litro",
+ "sharedImpGallon": "Galón Imp.",
+ "sharedUsGallon": "Galón U.S.",
+ "sharedLiterPerHourAbbreviation": "L/h",
+ "sharedGetMapState": "Obtener Estado del Mapa",
+ "sharedComputedAttribute": "Atributo calculado",
+ "sharedComputedAttributes": "Atributos calculados",
+ "sharedCheckComputedAttribute": "Revisar atributo calculado",
+ "sharedExpression": "Expresión",
+ "sharedDevice": "Dispositivo",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Enviar notificación de prueba",
+ "sharedTestNotificators": "Canales Test",
+ "sharedTestExpression": "Expresión Test",
+ "sharedCalendar": "Calendario",
+ "sharedCalendars": "Calendarios",
+ "sharedFile": "Archivo",
+ "sharedSearchDevices": "Buscar Dispositivos",
+ "sharedSortBy": "Ordenar por",
+ "sharedFilterMap": "Filtrar en Mapa",
+ "sharedSelectFile": "Seleccione archivo",
+ "sharedPhone": "Teléfono",
+ "sharedRequired": "Obligatorio",
+ "sharedPreferences": "Preferencias",
+ "sharedPermissions": "Permisos",
+ "sharedConnections": "Conexiones",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Principal",
+ "sharedSecondary": "Secundario",
+ "sharedTypeString": "Cadena",
+ "sharedTypeNumber": "Número",
+ "sharedTypeBoolean": "Booleano",
+ "sharedTimezone": "Zona Horaria",
+ "sharedInfoTitle": "Información",
+ "sharedSavedCommand": "Comando guardado",
+ "sharedSavedCommands": "Comandos guardados",
+ "sharedNew": "Nuevo…",
+ "sharedShowAddress": "Mostrar calle",
+ "sharedShowDetails": "Más detalles",
+ "sharedDisabled": "Deshabilitado",
+ "sharedMaintenance": "Mantenimientos",
+ "sharedDeviceAccumulators": "Acumulador",
+ "sharedAlarms": "Alarmas",
+ "sharedLocation": "Ubicación",
+ "sharedImport": "Importar",
+ "sharedColumns": "Columnas",
+ "sharedDropzoneText": "Arrastra y suelta el archivo aquí o pulsa",
+ "sharedLogs": "Registros",
+ "sharedLink": "Enlace",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrente",
+ "calendarOnce": "Una vez",
+ "calendarDaily": "Diario",
+ "calendarWeekly": "Semanal",
+ "calendarMonthly": "Mensual",
+ "calendarDays": "Días",
+ "calendarSunday": "Domingo",
+ "calendarMonday": "Lunes",
+ "calendarTuesday": "Martes",
+ "calendarWednesday": "Miércoles",
+ "calendarThursday": "Jueves",
+ "calendarFriday": "Viernes",
+ "calendarSaturday": "Sábado",
+ "attributeShowGeofences": "Mostrar Geo-Zonas",
+ "attributeSpeedLimit": "Límite de velocidad",
+ "attributeFuelDropThreshold": "Umbral de pérdida de combustible",
+ "attributeFuelIncreaseThreshold": "Umbral del subida de combustible",
+ "attributePolylineDistance": "Distancia de polilínea",
+ "attributeReportIgnoreOdometer": "Informe: Ignorar el odómetro",
+ "attributeWebReportColor": "Web: Color de informe",
+ "attributeDevicePassword": "Contraseña de dispositivo",
+ "attributeDeviceImage": "Imagen del dispositivo",
+ "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 directo",
+ "attributeWebSelectZoom": "Web: hacer zoom al seleccionar",
+ "attributeWebMaxZoom": "Web: Zoom máximo",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Nombres de Dispositivo",
+ "attributeMailSmtpHost": "Correo: Servidor SMTP",
+ "attributeMailSmtpPort": "Correo: Puerto SMTP",
+ "attributeMailSmtpStarttlsEnable": "Correo: Activar SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "Correo: SMTP STARTTLS requerido",
+ "attributeMailSmtpSslEnable": "Correo: Activar SMTP SSL",
+ "attributeMailSmtpSslTrust": "Correo: SMTP SSL de confianza",
+ "attributeMailSmtpSslProtocols": "Correo: protocolos SMTP SSL",
+ "attributeMailSmtpFrom": "Correo: SMTP desde",
+ "attributeMailSmtpAuth": "Correo: Activar autenticación SMTP",
+ "attributeMailSmtpUsername": "Correo: Nombre de usuario SMTP",
+ "attributeMailSmtpPassword": "Correo: Contraseña SMTP",
+ "attributeUiDisableSavedCommands": "UI: Deshabilitar Comandos guardados",
+ "attributeUiDisableAttributes": "UI: Deshabilitar Atributos",
+ "attributeUiDisableGroups": "UI: Deshabilitar Grupos",
+ "attributeUiDisableEvents": "UI: Deshabilitar panel Eventos",
+ "attributeUiDisableVehicleFeatures": "UI: Desactivar características del vehículo",
+ "attributeUiDisableDrivers": "UI: Desactivar Conductores",
+ "attributeUiDisableComputedAttributes": "UI: Desactivar Atributos calculados",
+ "attributeUiDisableCalendars": "UI: Desactivar Calendario",
+ "attributeUiDisableMaintenance": "UI: Deshabilitar Mantenimiento",
+ "attributeUiHidePositionAttributes": "UI: Ocultar Atributos de Posición",
+ "attributeUiDisableLoginLanguage": "UI: Deshabilitar Idioma de inicio de sesión",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Información popup",
+ "errorTitle": "Error",
+ "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": "Caducidad",
+ "userDeviceLimit": "Límite de dispositivos",
+ "userUserLimit": "Límite de usuarios",
+ "userDeviceReadonly": "Dispositivo de solo lectura",
+ "userLimitCommands": "Limitar Comandos",
+ "userDisableReports": "Deshabilitar Informes",
+ "userFixedEmail": "No cambiar email",
+ "userToken": "Token Acceso",
+ "userDeleteAccount": "Borrar cuenta",
+ "userTemporary": "Temporal",
+ "loginTitle": "Iniciar sesión",
+ "loginLanguage": "Idioma",
+ "loginReset": "Reiniciar contraseña",
+ "loginRegister": "Registrarse",
+ "loginLogin": "Iniciar sesión",
+ "loginOpenId": "Iniciar sesión con OpenID",
+ "loginFailed": "Email o contraseña incorrecta",
+ "loginCreated": "Se ha registrado un nuevo usuario",
+ "loginResetSuccess": "Comprueba tu email",
+ "loginUpdateSuccess": "Se ha creado la nueva contraseña",
+ "loginLogout": "Cerrar Sesión",
+ "loginLogo": "Logotipo",
+ "loginTotpCode": "Código de un solo uso",
+ "loginTotpKey": "Llave de un solo uso",
+ "devicesAndState": "Dispositivos y Estado",
+ "deviceSelected": "Dispositivo seleccionado",
+ "deviceTitle": "Dispositivos",
+ "devicePrimaryInfo": "Título del dispositivo",
+ "deviceSecondaryInfo": "Detalles del dispositivo",
+ "deviceIdentifier": "Identificador",
+ "deviceModel": "Modelo",
+ "deviceContact": "Contacto",
+ "deviceCategory": "Categoría",
+ "deviceLastUpdate": "Última Actualización",
+ "deviceCommand": "Comando",
+ "deviceFollow": "Seguir",
+ "deviceTotalDistance": "Distancia Total",
+ "deviceStatus": "Estado",
+ "deviceStatusOnline": "En línea",
+ "deviceStatusOffline": "Fuera de línea",
+ "deviceStatusUnknown": "Desconocido",
+ "deviceRegisterFirst": "Registre su primer dispositivo",
+ "deviceIdentifierHelp": "El IMEI, numero de serie u otro id, tiene que ser igual que el identificador del dispositivo que reporta al servidor.",
+ "deviceShare": "Compartir dispositivo",
+ "groupDialog": "Grupo",
+ "groupParent": "Grupo",
+ "groupNoGroup": "Sin grupo",
+ "settingsTitle": "Ajustes",
+ "settingsUser": "Cuenta",
+ "settingsGroups": "Grupos",
+ "settingsServer": "Servidor",
+ "settingsUsers": "Usuarios",
+ "settingsDistanceUnit": "Unidad de Distancia",
+ "settingsAltitudeUnit": "Unidad de Altitud",
+ "settingsSpeedUnit": "Unidad de Velocidad",
+ "settingsVolumeUnit": "Unidad de Volumen",
+ "settingsTwelveHourFormat": "Formato de 12h.",
+ "settingsCoordinateFormat": "Formato de Coordenadas",
+ "settingsServerVersion": "Versión del servidor",
+ "settingsAppVersion": "Versión de la app",
+ "settingsConnection": "Conexión",
+ "settingsDarkMode": "Modo Oscuro",
+ "settingsTotpEnable": "Activar contraseña de un solo uso",
+ "settingsTotpForce": "Forzar contraseña de un solo uso",
+ "settingsServiceWorkerUpdateInterval": "Intervalo de actualización del ServiceWorker",
+ "settingsUpdateAvailable": "Hay una actualización disponible.",
+ "settingsSupport": "Soporte",
+ "reportTitle": "Reportes",
+ "reportScheduled": "Reportes Programados",
+ "reportDevice": "Dispositivos",
+ "reportGroup": "Grupo",
+ "reportFrom": "Desde",
+ "reportTo": "Hasta",
+ "reportShow": "Mostrar",
+ "reportClear": "Limpiar",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Hora ajustada",
+ "positionDeviceTime": "Hora del dispositivo",
+ "positionServerTime": "Hora del Servidor",
+ "positionValid": "Válida",
+ "positionAccuracy": "Precisión",
+ "positionLatitude": "Latitud",
+ "positionLongitude": "Longitud",
+ "positionAltitude": "Altitud",
+ "positionSpeed": "Velocidad",
+ "positionCourse": "Rumbo",
+ "positionAddress": "Dirección Calle",
+ "positionProtocol": "Protocolo",
+ "positionDistance": "Distancia",
+ "positionRpm": "RPM",
+ "positionFuel": "Combustible",
+ "positionPower": "Energía",
+ "positionBattery": "Batería",
+ "positionRaw": "Crudo",
+ "positionIndex": "Índice / Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satélites",
+ "positionSatVisible": "Satélites Visibles",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Evento",
+ "positionAlarm": "Alarma",
+ "positionStatus": "Estado",
+ "positionOdometer": "Odómetro",
+ "positionServiceOdometer": "Odómetro de mantenimiento",
+ "positionTripOdometer": "Odómetro de viaje",
+ "positionHours": "Horas",
+ "positionSteps": "Pasos",
+ "positionInput": "Entrada",
+ "positionHeartRate": "Ritmo cardiaco",
+ "positionOutput": "Salida",
+ "positionBatteryLevel": "Nivel de batería",
+ "positionFuelConsumption": "Consumo de combustible",
+ "positionRfid": "RFDI",
+ "positionVersionFw": "Versión de firmware",
+ "positionVersionHw": "Versión de hardware",
+ "positionIgnition": "Encendido",
+ "positionFlags": "Banderas",
+ "positionCharge": "Carga",
+ "positionIp": "IP",
+ "positionArchive": "Archivo",
+ "positionVin": "VIN",
+ "positionApproximate": "Aproximado",
+ "positionThrottle": "Acelerador",
+ "positionMotion": "Movimiento",
+ "positionArmed": "Armado",
+ "positionAcceleration": "Aceleración",
+ "positionTemp": "Temperatura",
+ "positionDeviceTemp": "Temperatura del dispositivo",
+ "positionCoolantTemp": "Temperatura del Refrigerante",
+ "positionOperator": "Operador",
+ "positionCommand": "Comando",
+ "positionBlocked": "Bloqueado",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Velocidad OBD",
+ "positionObdOdometer": "Odómetro OBD",
+ "positionDrivingTime": "Tiempo Conduciendo",
+ "positionDriverUniqueId": "ID única del conductor",
+ "positionCard": "Tarjeta",
+ "positionImage": "Imagen",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Ajustes del servidor",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registro",
+ "serverReadonly": "Solo lectura",
+ "serverForceSettings": "Forzar estos ajustes",
+ "serverAnnouncement": "Mostrar anuncio",
+ "serverName": "Nombre del Servidor",
+ "serverDescription": "Descripción del Servidor",
+ "serverColorPrimary": "Color Primario",
+ "serverColorSecondary": "Color Secundario",
+ "serverLogo": "Imagen del Logo",
+ "serverLogoInverted": "Imagen de logo invertida",
+ "serverChangeDisable": "Deshabilitar el cambio de servidor",
+ "serverDisableShare": "Deshabilitar poder Compartir Dispositivos",
+ "mapTitle": "Mapa",
+ "mapActive": "Mapas activos",
+ "mapOverlay": "Capa sobre el mapa",
+ "mapOverlayCustom": "Capa personalizada",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Capas del Mapa",
+ "mapCustom": "Personalizado (XYZ)",
+ "mapCustomArcgis": "ArcGIS Personalizado",
+ "mapCustomLabel": "Mapa Personalizado",
+ "mapCarto": "Carto",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Carreteras",
+ "mapGoogleHybrid": "Google Híbrido",
+ "mapGoogleSatellite": "Google Satélite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps - Carretera",
+ "mapBingAerial": "Bing Maps - Aéreo",
+ "mapBingHybrid": "Bing Maps - Híbrido",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex",
+ "mapYandexSat": "Yandex Satélite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polígono",
+ "mapShapeCircle": "Círculo",
+ "mapShapePolyline": "Polilínea",
+ "mapLiveRoutes": "Rutas en Directo",
+ "mapDirection": "Mostrar dirección",
+ "mapCurrentLocation": "Ubicación Actual",
+ "mapPoiLayer": "Capa POI",
+ "mapClustering": "Agrupar Marcadores",
+ "mapOnSelect": "Mostrar Mapas en la selección",
+ "mapDefault": "Mapa por defecto",
+ "stateTitle": "Estado",
+ "stateName": "Parámetro",
+ "stateValue": "Valor",
+ "commandTitle": "Comando",
+ "commandSend": "Enviar",
+ "commandSent": "Comando enviado",
+ "commandQueued": "Comando en cola",
+ "commandUnit": "Unidad",
+ "commandCustom": "Comando personalizado",
+ "commandDeviceIdentification": "Identificación de Dispositivo",
+ "commandPositionSingle": "Informe Único",
+ "commandPositionPeriodic": "Informe Periódico",
+ "commandPositionStop": "Detener Informe",
+ "commandEngineStop": "Apagar motor",
+ "commandEngineResume": "Desbloquear Encendido de Motor",
+ "commandAlarmArm": "Armar Alarma",
+ "commandAlarmDisarm": "Desarmar Alarma",
+ "commandAlarmDismiss": "Descartar Alarma",
+ "commandSetTimezone": "Establecer Zona Horaria",
+ "commandRequestPhoto": "Solicitar Foto",
+ "commandPowerOff": "Apagar dispositivo",
+ "commandRebootDevice": "Reiniciar dispositivo",
+ "commandFactoryReset": "Valores de fábrica",
+ "commandSendSms": "Enviar SMS",
+ "commandSendUssd": "Enviar USSD",
+ "commandSosNumber": "Establecer el número SOS",
+ "commandSilenceTime": "Establecer horario de silencio",
+ "commandSetPhonebook": "Establecer contacto",
+ "commandVoiceMessage": "Mensaje de voz",
+ "commandOutputControl": "Control de Salidas",
+ "commandVoiceMonitoring": "Monitoreo de Voz",
+ "commandSetAgps": "Establecer AGPS",
+ "commandSetIndicator": "Establecer indicador",
+ "commandConfiguration": "Configuración",
+ "commandGetVersion": "Obtener Versión",
+ "commandFirmwareUpdate": "Actualizar Firmware",
+ "commandSetConnection": "Establecer Conexión",
+ "commandSetOdometer": "Establecer Odómetro",
+ "commandGetModemStatus": "Obtener Estatus de Módem",
+ "commandGetDeviceStatus": "Obtener Estatus de Dispositivo",
+ "commandSetSpeedLimit": "Establecer Límite de Velocidad",
+ "commandModePowerSaving": "Modo Ahorro de Energía",
+ "commandModeDeepSleep": "Modo Ahorro de Energía Profundo",
+ "commandAlarmGeofence": "Establecer Alarma de Geo-Zona",
+ "commandAlarmBattery": "Establecer Alarma de Batería",
+ "commandAlarmSos": "Establecer Alarma de SOS",
+ "commandAlarmRemove": "Establecer Alarma de Desmontaje",
+ "commandAlarmClock": "Establecer Alarma de Hora",
+ "commandAlarmSpeed": "Establecer Alarma de Velocidad",
+ "commandAlarmFall": "Establecer Alarma de Caída",
+ "commandAlarmVibration": "Establecer Alarma de Vibración",
+ "commandFrequency": "Frequencia",
+ "commandTimezone": "Compensación de zona horaria",
+ "commandMessage": "Mensaje",
+ "commandRadius": "Radio",
+ "commandEnable": "Activado",
+ "commandData": "Datos",
+ "commandIndex": "Índice",
+ "commandPhone": "Número de Teléfono",
+ "commandServer": "Servidor",
+ "commandPort": "Puerto",
+ "eventAll": "Todos los eventos",
+ "eventDeviceOnline": "Dispositivo en Línea",
+ "eventDeviceUnknown": "Dispositivo en estado Desconocido",
+ "eventDeviceOffline": "Dispositivo Fuera de Línea",
+ "eventDeviceInactive": "Dispositivo Inactivo",
+ "eventQueuedCommandSent": "Comando en cola enviado",
+ "eventDeviceMoving": "Dispositivo en Movimiento",
+ "eventDeviceStopped": "Dispositivo Detenido",
+ "eventDeviceOverspeed": "Excedido el límite de Velocidad",
+ "eventDeviceFuelDrop": "Perdida de Combustible ",
+ "eventDeviceFuelIncrease": "Incremento de combustible",
+ "eventCommandResult": "Resultado del comando",
+ "eventGeofenceEnter": "Entrada en la Geo-Zona",
+ "eventGeofenceExit": "Salida de la Geo-Zona",
+ "eventAlarm": "Alarma ",
+ "eventIgnitionOn": "Llave encendido ON",
+ "eventIgnitionOff": "Llave encendido OFF",
+ "eventMaintenance": "Se requiere mantenimiento",
+ "eventTextMessage": "Mensaje de texto recibido",
+ "eventDriverChanged": "El conductor ha cambiado",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Desplazarse hasta el último",
+ "eventsSoundEvents": "Sonido para eventos",
+ "eventsSoundAlarms": "Sonido para alarmas",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibración",
+ "alarmMovement": "Movimiento",
+ "alarmLowspeed": "Baja Velocidad",
+ "alarmOverspeed": "Exceso de Velocidad ",
+ "alarmFallDown": "Alarma de caída",
+ "alarmLowPower": "Energía baja",
+ "alarmLowBattery": "Batería Baja",
+ "alarmFault": "Alarma de fallo",
+ "alarmPowerOff": "Apagado",
+ "alarmPowerOn": "Encendido",
+ "alarmDoor": "Puerta",
+ "alarmLock": "Bloqueado",
+ "alarmUnlock": "Desbloquear",
+ "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": "Grúa de arrastre",
+ "alarmIdle": "Reposo",
+ "alarmHighRpm": "Altas revoluciones",
+ "alarmHardAcceleration": "Aceleración brusca",
+ "alarmHardBraking": "Frenada extrema",
+ "alarmHardCornering": "Giro brusco",
+ "alarmLaneChange": "Cambio de carril",
+ "alarmFatigueDriving": "Conducción fatigosa",
+ "alarmPowerCut": "Energía desconectada",
+ "alarmPowerRestored": "Energía restaurada",
+ "alarmJamming": "Interferencia",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Aparcamiento",
+ "alarmBonnet": "Capó",
+ "alarmFootBrake": "Freno de pie",
+ "alarmFuelLeak": "Fuga de combustible",
+ "alarmTampering": "Manipulación",
+ "alarmRemoving": "Eliminando",
+ "notificationType": "Tipo de Notificación",
+ "notificationAlways": "Todos los dispositivos",
+ "notificationNotificators": "Canales",
+ "notificatorCommand": "Comando",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Correo",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Repetición Ruta",
+ "reportCombined": "Combinado",
+ "reportRoute": "Ruta",
+ "reportEvents": "Eventos",
+ "reportTrips": "Viajes",
+ "reportStops": "Paradas",
+ "reportSummary": "Resumen",
+ "reportDaily": "Resumen diario",
+ "reportChart": "Gráfica",
+ "reportConfigure": "Configurar",
+ "reportEventTypes": "Tipos de evento",
+ "reportChartType": "Tipo de gráfica",
+ "reportShowMarkers": "Mostrar marcadores",
+ "reportExport": "Exportar",
+ "reportEmail": "Informe por correo",
+ "reportSchedule": "Planificación",
+ "reportPeriod": "Período",
+ "reportCustom": "Personalizado",
+ "reportToday": "Hoy",
+ "reportYesterday": "Ayer",
+ "reportThisWeek": "Semana Actual",
+ "reportPreviousWeek": "Semana Anterior",
+ "reportThisMonth": "Mes Actual",
+ "reportPreviousMonth": "Mes Anterior",
+ "reportDeviceName": "Nombre",
+ "reportAverageSpeed": "Velocidad media",
+ "reportMaximumSpeed": "Velocidad máxima",
+ "reportEngineHours": "Horas motor",
+ "reportDuration": "Duración",
+ "reportStartDate": "Fecha de inicio",
+ "reportStartTime": "Hora de Inicio",
+ "reportStartAddress": "Dirección de Inicio",
+ "reportEndTime": "Hora de Fin",
+ "reportEndAddress": "Dirección de Fin",
+ "reportSpentFuel": "Combustible consumido",
+ "reportStartOdometer": "Odómetro inicial",
+ "reportEndOdometer": "Odómetro final",
+ "statisticsTitle": "Estadísticas",
+ "statisticsCaptureTime": "Fecha de captura",
+ "statisticsActiveUsers": "Usuarios activos",
+ "statisticsActiveDevices": "Dispositivos activos",
+ "statisticsRequests": "Peticiones",
+ "statisticsMessagesReceived": "Mensajes recibidos",
+ "statisticsMessagesStored": "Mensajes almacenados",
+ "statisticsGeocoder": "Solicitudes al codificador geográfico",
+ "statisticsGeolocation": "Solicitudes de geolocalización",
+ "categoryArrow": "Flecha",
+ "categoryDefault": "Prederminado",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicicleta",
+ "categoryBoat": "Barco",
+ "categoryBus": "Autobús",
+ "categoryCar": "Automóvil",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Grúa",
+ "categoryHelicopter": "Helicóptero",
+ "categoryMotorcycle": "Motocicleta",
+ "categoryOffroad": "Todoterreno",
+ "categoryPerson": "Persona",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Avión",
+ "categoryShip": "Barco",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Trén",
+ "categoryTram": "Tranvía",
+ "categoryTrolleybus": "Trolebús",
+ "categoryTruck": "Camión",
+ "categoryVan": "Furgoneta",
+ "categoryScooter": "Moto",
+ "maintenanceStart": "Iniciar",
+ "maintenancePeriod": "Período"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/fa.json b/legacy/web/l10n/fa.json
new file mode 100644
index 00000000..3507681c
--- /dev/null
+++ b/legacy/web/l10n/fa.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "در حال بارگزارى ...",
+ "sharedHide": "مخفی",
+ "sharedSave": "ذخيره",
+ "sharedUpload": "Upload",
+ "sharedSet": "تنظیم",
+ "sharedCancel": "انصراف",
+ "sharedCopy": "Copy",
+ "sharedAdd": "اضافه كردن",
+ "sharedEdit": "ویرایش",
+ "sharedRemove": "پاک کردن",
+ "sharedRemoveConfirm": "پاک کردن آیتم",
+ "sharedNoData": "داده ای نیست",
+ "sharedSubject": "Subject",
+ "sharedYes": "بلی",
+ "sharedNo": "خیر",
+ "sharedKm": "Km",
+ "sharedMi": "Mile",
+ "sharedNmi": "مایل دریایی",
+ "sharedMeters": "متر",
+ "sharedFeet": "فوت",
+ "sharedKn": "گره دریایی",
+ "sharedKmh": "Km/h",
+ "sharedMph": "M/h",
+ "sharedHour": "ساعت",
+ "sharedMinute": "دقيقه",
+ "sharedSecond": "ثانيه",
+ "sharedDays": "روز",
+ "sharedHours": "ساعت",
+ "sharedMinutes": "دقیقه",
+ "sharedDecimalDegrees": "درجه اعشار",
+ "sharedDegreesDecimalMinutes": "درجه اعشار دقیقه",
+ "sharedDegreesMinutesSeconds": "درجه اعشار ثانیه",
+ "sharedName": "نام",
+ "sharedDescription": "توضیحات",
+ "sharedSearch": "جستجو",
+ "sharedIconScale": "اندازه آیکن",
+ "sharedGeofence": "حصار جغرافیایی",
+ "sharedGeofences": "حصارهای جغرافیایی",
+ "sharedCreateGeofence": "ایجاد جغرافیا",
+ "sharedNotifications": "رویدادها",
+ "sharedNotification": "اطلاعیه",
+ "sharedAttributes": "ویژگی ها",
+ "sharedAttribute": "ویژگی",
+ "sharedDrivers": "رانندگان",
+ "sharedDriver": "راننده",
+ "sharedArea": "محدوده",
+ "sharedSound": "صدای هشدار",
+ "sharedType": "نوع خط",
+ "sharedDistance": "طول مسیر",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "گالن",
+ "sharedLiter": "لیتر",
+ "sharedImpGallon": "گالن UK",
+ "sharedUsGallon": "گالن US",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "دریافت نقشه وضعیت",
+ "sharedComputedAttribute": "ویژگی محاسبه شده",
+ "sharedComputedAttributes": "ویژگیهای محاسبه شده",
+ "sharedCheckComputedAttribute": "بررسی ویژگی محاسبه شده",
+ "sharedExpression": "اصطلاح",
+ "sharedDevice": "دستگاه",
+ "sharedTest": "آزمایش",
+ "sharedTestNotification": "ارسال تست اخطار",
+ "sharedTestNotificators": "آزمایش کانال ها",
+ "sharedTestExpression": "تست اصطلاح",
+ "sharedCalendar": "تقویم",
+ "sharedCalendars": "تقویمها",
+ "sharedFile": "فایل",
+ "sharedSearchDevices": "جستجوی دستگاهها",
+ "sharedSortBy": "مرتب سازی",
+ "sharedFilterMap": "فیلتر بر روی نقشه",
+ "sharedSelectFile": "انتخاب فایل",
+ "sharedPhone": "تلفن",
+ "sharedRequired": "ضروری",
+ "sharedPreferences": "تنظیمات",
+ "sharedPermissions": "دسترسی ها",
+ "sharedConnections": "اتصالات",
+ "sharedExtra": "بیشتر",
+ "sharedPrimary": "اولیه",
+ "sharedSecondary": "ثانویه",
+ "sharedTypeString": "رشته",
+ "sharedTypeNumber": "عدد",
+ "sharedTypeBoolean": "True/False",
+ "sharedTimezone": "منطقه زمانی",
+ "sharedInfoTitle": "اطلاعات",
+ "sharedSavedCommand": "دستور ذخیره شده",
+ "sharedSavedCommands": "دستورات ذخیره شده",
+ "sharedNew": "جدید...",
+ "sharedShowAddress": "نمایش آدرس",
+ "sharedShowDetails": "جزئیات بیشتر",
+ "sharedDisabled": "غیرفعال شده",
+ "sharedMaintenance": "تعمیر و نگهداری",
+ "sharedDeviceAccumulators": "باطری",
+ "sharedAlarms": "هشدارها",
+ "sharedLocation": "مکان",
+ "sharedImport": "وارد كردن",
+ "sharedColumns": "ستونها",
+ "sharedDropzoneText": "یک فایل را در اینجا بکشید و رها کنید یا کلیک کنید",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "ساده",
+ "calendarRecurrence": "عکس العمل",
+ "calendarOnce": "یکبار",
+ "calendarDaily": "روزانه",
+ "calendarWeekly": "هفتگی",
+ "calendarMonthly": "ماهانه",
+ "calendarDays": "روزها",
+ "calendarSunday": "یکشنبه",
+ "calendarMonday": "دوشنبه",
+ "calendarTuesday": "سه شنبه",
+ "calendarWednesday": "چهارشنبه",
+ "calendarThursday": "پنجشنبه",
+ "calendarFriday": "جمعه",
+ "calendarSaturday": "شنبه",
+ "attributeShowGeofences": "نمایش حصار مجازی",
+ "attributeSpeedLimit": "محدودیت سرعت",
+ "attributeFuelDropThreshold": "حد اتمام سوخت",
+ "attributeFuelIncreaseThreshold": "حد تکمیل سوخت",
+ "attributePolylineDistance": "مسافت چند مسیری",
+ "attributeReportIgnoreOdometer": "گزارش : بدون کیلومتر شمار",
+ "attributeWebReportColor": "وب : گزارش رنگ",
+ "attributeDevicePassword": "رمز عبور ردیاب",
+ "attributeDeviceImage": "عکس دستگاه",
+ "attributeDeviceInactivityStart": "آغاز عدم فعالیت دستگاه",
+ "attributeDeviceInactivityPeriod": "دوره عدم فعالیت دستگاه",
+ "attributeProcessingCopyAttributes": "در حال پردازش : کپی ویژگیها",
+ "attributeColor": "رنگ",
+ "attributeWebLiveRouteLength": "وب : طول جاده آنلاین",
+ "attributeWebSelectZoom": "وب : زوم با انتخاب",
+ "attributeWebMaxZoom": "بیشترین زوم",
+ "attributeTelegramChatId": "آی دی تلگرام",
+ "attributePushoverUserKey": "Pushover کلید کاربری",
+ "attributePushoverDeviceNames": "Pushover نام دستگاه",
+ "attributeMailSmtpHost": "ایمیل : هاست SMTP",
+ "attributeMailSmtpPort": "ایمیل : پورت SMTP",
+ "attributeMailSmtpStarttlsEnable": "ایمیل : SMTP STARTTLS فعال",
+ "attributeMailSmtpStarttlsRequired": "ایمیل : SMTP STARTTLS ضروری است",
+ "attributeMailSmtpSslEnable": "ایمیل : SMTP SSL فعال",
+ "attributeMailSmtpSslTrust": "ایمیل : SMTP SSL معتبر",
+ "attributeMailSmtpSslProtocols": "ایمیل : پروتکلهای SMTP SSL",
+ "attributeMailSmtpFrom": "ایمیل : SMTP ازطرف",
+ "attributeMailSmtpAuth": "ایمیل : معتبر سازی SMTP فعال",
+ "attributeMailSmtpUsername": "ایمیل : نام کاربری SMTP",
+ "attributeMailSmtpPassword": "ایمیل : رمز عبور SMTP",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: ویژگی ها را غیرفعال کنید",
+ "attributeUiDisableGroups": "UI: غیر فعال کردن گروه ها",
+ "attributeUiDisableEvents": "UI: غیر فعال کردن رویدادها",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "غیرفعالسازی رانندگان",
+ "attributeUiDisableComputedAttributes": "غیرفعالسازی محاسبات",
+ "attributeUiDisableCalendars": "غیرفعالسازی تقویم",
+ "attributeUiDisableMaintenance": "غیر فعال کردن تعمییرات",
+ "attributeUiHidePositionAttributes": "پنهان کردن ویژگی های موقعیت",
+ "attributeUiDisableLoginLanguage": "UI: انتخاب زبان در هنگام ورود را غیرفعال کنید",
+ "attributeNotificationTokens": "اخطار توکن",
+ "attributePopupInfo": "اطلاعات Popup",
+ "errorTitle": "خطا",
+ "errorGeneral": "نقض پارامترها یا محدودیت ها نامعتبر است",
+ "errorConnection": "خطا در اتصال",
+ "errorSocket": "ایراد اتصال سوکت وب",
+ "errorZero": "نمیتواند صفر باشد",
+ "userEmail": "ایمیل",
+ "userPassword": "رمز عبور",
+ "userAdmin": "مدیر",
+ "userRemember": "به یاد آوردن",
+ "userExpirationTime": "انقضاء",
+ "userDeviceLimit": "محدودیت دستگاه",
+ "userUserLimit": "محدودیت کاربر",
+ "userDeviceReadonly": "دستگاه فقط خواندنی",
+ "userLimitCommands": "دستورات محدود",
+ "userDisableReports": "گزارشات غیرفعال",
+ "userFixedEmail": "عدم تغییر ایمیل",
+ "userToken": "رمز یکبار",
+ "userDeleteAccount": "حذف اکانت",
+ "userTemporary": "Temporary",
+ "loginTitle": "ورود",
+ "loginLanguage": "انتخاب زبان",
+ "loginReset": "بازیابی رمز عبور",
+ "loginRegister": "ثبت نام",
+ "loginLogin": "ورود",
+ "loginOpenId": "با OpenID وارد شوید",
+ "loginFailed": "نام كاربرى يا گذرواژه اشتباه است",
+ "loginCreated": "ثبت نام با موفقيت انجام شد",
+ "loginResetSuccess": "ایمیلتان را چک کنید",
+ "loginUpdateSuccess": "رمز جدید اعمال شد",
+ "loginLogout": "خروج",
+ "loginLogo": "لوگو",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "دستگاه ها و وضعیت",
+ "deviceSelected": "دستگاه انتخاب شده",
+ "deviceTitle": "دستگاه ها",
+ "devicePrimaryInfo": "عنوان دستگاه",
+ "deviceSecondaryInfo": "جزئیات دستگاه",
+ "deviceIdentifier": "سريال دستگاه",
+ "deviceModel": "مدل",
+ "deviceContact": "تماس",
+ "deviceCategory": "دسته بندی",
+ "deviceLastUpdate": "آخرين بروزرسانى",
+ "deviceCommand": "فرمان",
+ "deviceFollow": "تعقیب",
+ "deviceTotalDistance": "کل مسافت",
+ "deviceStatus": "وضعیت",
+ "deviceStatusOnline": "آنلاین",
+ "deviceStatusOffline": "آفلاین",
+ "deviceStatusUnknown": "نامعلوم",
+ "deviceRegisterFirst": "اولین دستگاه خود را ثبت کنید",
+ "deviceIdentifierHelp": "IEMI ، شماره سریال یا شناسه دیگر باید با گزارش های دستگاه شناسه به سرور مطابقت داشته باشد.",
+ "deviceShare": "Share Device",
+ "groupDialog": "گروه",
+ "groupParent": "گروه",
+ "groupNoGroup": "بدون گروه",
+ "settingsTitle": "تنظيمات",
+ "settingsUser": "حساب كاربرى",
+ "settingsGroups": "گروه ها",
+ "settingsServer": "سرور",
+ "settingsUsers": "کاربر",
+ "settingsDistanceUnit": "واحد مسافت",
+ "settingsAltitudeUnit": "واحد ارتفاع",
+ "settingsSpeedUnit": "واحد سرعت",
+ "settingsVolumeUnit": "واحد حجم",
+ "settingsTwelveHourFormat": "فرمت ساعت : 12 ساعتی",
+ "settingsCoordinateFormat": "فرمت مختصاتی",
+ "settingsServerVersion": "نسخه سرور",
+ "settingsAppVersion": "نسخه برنامه",
+ "settingsConnection": "ارتباط",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "گزارشات ",
+ "reportScheduled": "گزارش های برنامه ریزی شده",
+ "reportDevice": "دستگاه",
+ "reportGroup": "گروه",
+ "reportFrom": "از",
+ "reportTo": "تا",
+ "reportShow": "نمایش",
+ "reportClear": "خالی کردن",
+ "linkGoogleMaps": "نقشه گوگل",
+ "linkAppleMaps": "نقشه اپل",
+ "linkStreetView": "نمای خیابان",
+ "positionFixTime": "زمان ثابت",
+ "positionDeviceTime": "زمان دستگاه",
+ "positionServerTime": "زمان سرور",
+ "positionValid": "معتبر",
+ "positionAccuracy": "دقت",
+ "positionLatitude": "عرض جغرافيايى",
+ "positionLongitude": "طول جغرافيايى",
+ "positionAltitude": "ارتفاع",
+ "positionSpeed": "سرعت",
+ "positionCourse": "دوره",
+ "positionAddress": "آدرس",
+ "positionProtocol": "پروتکل",
+ "positionDistance": "مسافت",
+ "positionRpm": "دور / دقیقه",
+ "positionFuel": "سوخت",
+ "positionPower": "روشن بودن",
+ "positionBattery": "باطری",
+ "positionRaw": "خالص",
+ "positionIndex": "شاخص",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "ماهواره ها",
+ "positionSatVisible": "ماهواره های قابل مشاهده",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "رومینگ",
+ "positionEvent": "رویداد",
+ "positionAlarm": "هشدار",
+ "positionStatus": "وضعیت",
+ "positionOdometer": "کیلومتر شمار",
+ "positionServiceOdometer": "سرویس کیلومتر شمار",
+ "positionTripOdometer": "کیلومتر شمار مسافت",
+ "positionHours": "ساعت",
+ "positionSteps": "مراحل",
+ "positionInput": "ورود",
+ "positionHeartRate": "ضربان قلب",
+ "positionOutput": "خروج",
+ "positionBatteryLevel": "وضعیت باطری",
+ "positionFuelConsumption": "مصرف سوخت",
+ "positionRfid": "RFID",
+ "positionVersionFw": "ورژن فلش",
+ "positionVersionHw": "ورژن سخت افزار",
+ "positionIgnition": "روشن بودن",
+ "positionFlags": "نشانها",
+ "positionCharge": "شارژ",
+ "positionIp": "IP",
+ "positionArchive": "آرشیو",
+ "positionVin": "VIN",
+ "positionApproximate": "تقریبی",
+ "positionThrottle": "دریچه گاز",
+ "positionMotion": "حرکت",
+ "positionArmed": "مسلح",
+ "positionAcceleration": "شتاب",
+ "positionTemp": "درجه حرارت",
+ "positionDeviceTemp": "دمای دستگاه",
+ "positionCoolantTemp": "دمای مایع خنک کننده",
+ "positionOperator": "اپراتور",
+ "positionCommand": "کد دستوری",
+ "positionBlocked": "بلوکه",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "سرعت OBD",
+ "positionObdOdometer": "کیلومتر شمار ODB",
+ "positionDrivingTime": "زمان رانندگی",
+ "positionDriverUniqueId": "کد شناسایی راننده",
+ "positionCard": "کارت",
+ "positionImage": "تصویر",
+ "positionVideo": "ویدیو",
+ "positionAudio": "صدا",
+ "serverTitle": "تنظیمات سرور",
+ "serverZoom": "بزرگنمایی",
+ "serverRegistration": "ثبت نام",
+ "serverReadonly": "فقط خواندنی",
+ "serverForceSettings": "تنظیمات اجباری",
+ "serverAnnouncement": "اطلاعیه",
+ "serverName": "نام سرور",
+ "serverDescription": "توضیحات سرور",
+ "serverColorPrimary": "رنگ اصلی",
+ "serverColorSecondary": "رنگ ثانویه",
+ "serverLogo": "عکس لوگو",
+ "serverLogoInverted": "معکوس سازی رنگ لوگو",
+ "serverChangeDisable": "غیرفعال کردن تغییر سرور",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "نقشه",
+ "mapActive": "نقشه های فعال",
+ "mapOverlay": "لایه نقشه",
+ "mapOverlayCustom": "لایه سفارشی",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API کلید",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather فشار",
+ "mapOpenWeatherWind": "OpenWeather باد",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "لایه های نقشه",
+ "mapCustom": "سفارشی (XYZ)",
+ "mapCustomArcgis": "سفارشی (ArcGIS)",
+ "mapCustomLabel": "نقشه اختیاری",
+ "mapCarto": "نقشه کارتو",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google جاده",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google ماهواره",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing کلید نقشه",
+ "mapBingRoad": "Bing نقشه جاده",
+ "mapBingAerial": "Bing نقشه هوایی",
+ "mapBingHybrid": "Bing نقشه هیبریدی",
+ "mapBaidu": "Baidu چین",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex نقشه",
+ "mapYandexSat": "Yandex ماهواره",
+ "mapWikimedia": "ویکی مدیا",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox توکن دسترسی",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler کلید API",
+ "mapLocationIqStreets": "LocationIQ Streets نقشه",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ توکن دسترسی",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom جریان ترافیک",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom کلید API",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite نقشه",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "چند ضلعی",
+ "mapShapeCircle": "دایره ",
+ "mapShapePolyline": "چند خطی",
+ "mapLiveRoutes": "تعقیب مسیر",
+ "mapDirection": "نمایش جهت",
+ "mapCurrentLocation": "موقعیت فعلی",
+ "mapPoiLayer": "لایه POI",
+ "mapClustering": "خوشه بندی نشانگرها",
+ "mapOnSelect": "نمایش نقشه در انتخاب",
+ "mapDefault": "نقشه پیش فرض",
+ "stateTitle": "وضعیت",
+ "stateName": "ویژگی",
+ "stateValue": "مقدار",
+ "commandTitle": "ارسال دستور به دستگاه",
+ "commandSend": "ارسال",
+ "commandSent": "ارسال دستور",
+ "commandQueued": "دستور در صف",
+ "commandUnit": "واحد",
+ "commandCustom": "دستور سفارشی",
+ "commandDeviceIdentification": "شناسایی دستگاه",
+ "commandPositionSingle": "گزارش ساده",
+ "commandPositionPeriodic": "گزارشات چندوضعیتی",
+ "commandPositionStop": "توقف گزارش",
+ "commandEngineStop": "توقف موتور",
+ "commandEngineResume": "ادامه موتور",
+ "commandAlarmArm": "آلارم فعال",
+ "commandAlarmDisarm": "آلارم غیر فعال",
+ "commandAlarmDismiss": "رد کردن هشدار",
+ "commandSetTimezone": "تنظیم منطقه زمانی",
+ "commandRequestPhoto": "درخواست عکس",
+ "commandPowerOff": "خاموش شدن دستگاه",
+ "commandRebootDevice": "ریست کردن دستگاه",
+ "commandFactoryReset": "ریست تنظیم کارخانه",
+ "commandSendSms": "ارسال پیام کوتاه",
+ "commandSendUssd": "USSD ارسال کد",
+ "commandSosNumber": "شماره SOS را تنظیم کنید",
+ "commandSilenceTime": "تنظیم زمان سکوت",
+ "commandSetPhonebook": "تنظیم دفترچه تلفن",
+ "commandVoiceMessage": "پیام صوتی",
+ "commandOutputControl": "تنظیمات خروجی ",
+ "commandVoiceMonitoring": "کنترل صوتی",
+ "commandSetAgps": "تنظیم AGPS",
+ "commandSetIndicator": "ایجاد شاخص",
+ "commandConfiguration": "پیکر بندی",
+ "commandGetVersion": "دریافت نگارش",
+ "commandFirmwareUpdate": "به روز رسانی فریمور",
+ "commandSetConnection": "تنظیم ارتباط",
+ "commandSetOdometer": "تنظیم کیلومتر شمار",
+ "commandGetModemStatus": "دریافت وضعیت مودم",
+ "commandGetDeviceStatus": "دریافت وضعیت دستگاه",
+ "commandSetSpeedLimit": "تنظیم محدودیت سرعت",
+ "commandModePowerSaving": "حالت کم مصرف",
+ "commandModeDeepSleep": "حالت خواب عمیق",
+ "commandAlarmGeofence": "تنظیم هشدار محدوده جغرافیایی",
+ "commandAlarmBattery": "تنظیم هشدار باتری",
+ "commandAlarmSos": "تنظیم هشدار کمک",
+ "commandAlarmRemove": "تنظیم حذف هشدار",
+ "commandAlarmClock": "تنظیم ساعت هشدار",
+ "commandAlarmSpeed": "تنظیم هشدار سرعت",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "تاخیر ارسال",
+ "commandTimezone": "فاصله زمانی مبدا",
+ "commandMessage": "پیام",
+ "commandRadius": "شعاع",
+ "commandEnable": "فعال",
+ "commandData": "دیتا",
+ "commandIndex": "فهرست",
+ "commandPhone": "شماره تلفن",
+ "commandServer": "سرور",
+ "commandPort": "پورت",
+ "eventAll": "همه رویدادها",
+ "eventDeviceOnline": "وضعیت آنلاین",
+ "eventDeviceUnknown": "وضعیت نامعلوم",
+ "eventDeviceOffline": "وضعیت آفلاین",
+ "eventDeviceInactive": "دستگاه غیرفعال",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "حرکت دستگاه",
+ "eventDeviceStopped": "دستگاه متوقف شد",
+ "eventDeviceOverspeed": "سرعت از حد مجاز فراتر رفت",
+ "eventDeviceFuelDrop": "افت سوخت",
+ "eventDeviceFuelIncrease": "افزایش سوخت",
+ "eventCommandResult": "نتیجه ارسال دستور",
+ "eventGeofenceEnter": "ورود محدوده جغرافیایی",
+ "eventGeofenceExit": "خروج محدوده جغرافیایی",
+ "eventAlarm": "هشدار",
+ "eventIgnitionOn": "سویچ روشن",
+ "eventIgnitionOff": "سوئیچ خاموش",
+ "eventMaintenance": "نیاز به تعمیر",
+ "eventTextMessage": "پیامک دریافت شد",
+ "eventDriverChanged": "تعویض راننده",
+ "eventMedia": "مدیا",
+ "eventsScrollToLast": "اسکرول تا آخر",
+ "eventsSoundEvents": "رویدادهای صدا",
+ "eventsSoundAlarms": "هشدار صوتی",
+ "alarmGeneral": "اصلی",
+ "alarmSos": "درخواست کمک",
+ "alarmVibration": "لرزش",
+ "alarmMovement": "جابجایی",
+ "alarmLowspeed": "سرعت کم",
+ "alarmOverspeed": "سرعت بالا",
+ "alarmFallDown": "سقوط",
+ "alarmLowPower": "انرژی کم",
+ "alarmLowBattery": "باطری کم",
+ "alarmFault": "نقص",
+ "alarmPowerOff": "خاموش",
+ "alarmPowerOn": "روشن",
+ "alarmDoor": "درب",
+ "alarmLock": "قفل",
+ "alarmUnlock": "باز کردن",
+ "alarmGeofence": "محدوده جغرافیایی",
+ "alarmGeofenceEnter": "ورود محدوده جغرافیایی",
+ "alarmGeofenceExit": "خروج محدوده جغرافیایی",
+ "alarmGpsAntennaCut": "قطع آنتن GPS",
+ "alarmAccident": "تصادف",
+ "alarmTow": "یدک کش",
+ "alarmIdle": "بیکار",
+ "alarmHighRpm": "دورموتور بالا",
+ "alarmHardAcceleration": "شتاب تند",
+ "alarmHardBraking": "ترمز تند",
+ "alarmHardCornering": "زاویه شدید",
+ "alarmLaneChange": "تغییر مسیر",
+ "alarmFatigueDriving": "رانندگی خسته",
+ "alarmPowerCut": "قطع ولتاژ",
+ "alarmPowerRestored": "برگشت ولتاژ",
+ "alarmJamming": "مسدود",
+ "alarmTemperature": "دما",
+ "alarmParking": "پارکینگ",
+ "alarmBonnet": "صندوق",
+ "alarmFootBrake": "پدال ترمز",
+ "alarmFuelLeak": "نشت باک",
+ "alarmTampering": "دستکاری",
+ "alarmRemoving": "حذف",
+ "notificationType": "تعیین نوع رویداد ",
+ "notificationAlways": "همه ردیابها",
+ "notificationNotificators": "کانال ها",
+ "notificatorCommand": "فرمان",
+ "notificatorWeb": "وب",
+ "notificatorMail": "ایمیل",
+ "notificatorSms": "پیامک",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "تلگرام",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "بازپخش",
+ "reportCombined": "ترکیب شده",
+ "reportRoute": "مسیر های پیموده شده ",
+ "reportEvents": "رویداد ها",
+ "reportTrips": "مسافرتها",
+ "reportStops": "توقفها",
+ "reportSummary": "خلاصه وضعیت ",
+ "reportDaily": "وقایع روزانه",
+ "reportChart": "نمودار",
+ "reportConfigure": "تنظیمات",
+ "reportEventTypes": "نوع رویدادها",
+ "reportChartType": "نوع نمودار",
+ "reportShowMarkers": "نمایش علامتها",
+ "reportExport": "خروجی فایل",
+ "reportEmail": "گزارش پست الکترونیکی",
+ "reportSchedule": "برنامه زمانی",
+ "reportPeriod": "بازه",
+ "reportCustom": "سفارشی",
+ "reportToday": "امروز",
+ "reportYesterday": "دیروز",
+ "reportThisWeek": "هفته جاری",
+ "reportPreviousWeek": "هفته قبلی",
+ "reportThisMonth": "ماه جاری",
+ "reportPreviousMonth": "ماه قبلی",
+ "reportDeviceName": "نام دستگاه ",
+ "reportAverageSpeed": "سرعت میانگین",
+ "reportMaximumSpeed": "حداکثر سرعت",
+ "reportEngineHours": "مدت زمان روشن بودن وسیله",
+ "reportDuration": "مسافت",
+ "reportStartDate": "تاریخ آغاز",
+ "reportStartTime": "زمان شروع",
+ "reportStartAddress": "آدرس شروع",
+ "reportEndTime": "زمان پایانی",
+ "reportEndAddress": "آدرس پایانی",
+ "reportSpentFuel": "مصرف سوخت",
+ "reportStartOdometer": "شروع کیلومترشمار",
+ "reportEndOdometer": "پایان کیلومتر شمار",
+ "statisticsTitle": "گزارشات",
+ "statisticsCaptureTime": "زمان ضبط",
+ "statisticsActiveUsers": "کاربران فعال",
+ "statisticsActiveDevices": "ردیابهای فعال",
+ "statisticsRequests": "درخواستها",
+ "statisticsMessagesReceived": "پیامهای دریافتی",
+ "statisticsMessagesStored": "پیامها ذخیره",
+ "statisticsGeocoder": "درخواست محدوده",
+ "statisticsGeolocation": "درخواستهای محدوده",
+ "categoryArrow": "فلش",
+ "categoryDefault": "پیش فرض",
+ "categoryAnimal": "حیوان",
+ "categoryBicycle": "دوچرخه",
+ "categoryBoat": "قایق",
+ "categoryBus": "اتوبوس",
+ "categoryCar": "خودرو",
+ "categoryCamper": "Camper",
+ "categoryCrane": "جرثقیل",
+ "categoryHelicopter": "هلی کوپتر",
+ "categoryMotorcycle": "موتورسیکلت",
+ "categoryOffroad": "شاسی بلند",
+ "categoryPerson": "شخص",
+ "categoryPickup": "وانت",
+ "categoryPlane": "هواپیما",
+ "categoryShip": "کشتی",
+ "categoryTractor": "تراکتور",
+ "categoryTrain": "قطار",
+ "categoryTram": "تراموا",
+ "categoryTrolleybus": "تریلر",
+ "categoryTruck": "تریلی",
+ "categoryVan": "ون",
+ "categoryScooter": "اسکوتر",
+ "maintenanceStart": "شروع",
+ "maintenancePeriod": "بازه"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/fi.json b/legacy/web/l10n/fi.json
new file mode 100644
index 00000000..f5459166
--- /dev/null
+++ b/legacy/web/l10n/fi.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Ladataan...",
+ "sharedHide": "Piilota",
+ "sharedSave": "Tallenna",
+ "sharedUpload": "Lataa palvelimelle",
+ "sharedSet": "Aseta",
+ "sharedCancel": "Peruuta",
+ "sharedCopy": "Kopioi",
+ "sharedAdd": "Lisää",
+ "sharedEdit": "Muokkaa",
+ "sharedRemove": "Poista",
+ "sharedRemoveConfirm": "Poista kohde?",
+ "sharedNoData": "Ei dataa",
+ "sharedSubject": "Subject",
+ "sharedYes": "Kyllä",
+ "sharedNo": "Ei",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Tunti",
+ "sharedMinute": "Minuutti",
+ "sharedSecond": "Sekunti",
+ "sharedDays": "päivää",
+ "sharedHours": "tuntia",
+ "sharedMinutes": "minuuttia",
+ "sharedDecimalDegrees": "Desimaaliasteet",
+ "sharedDegreesDecimalMinutes": "Asteet ja desimaaliminuutit",
+ "sharedDegreesMinutesSeconds": "Asteet, minuutit ja sekunnit",
+ "sharedName": "Nimi",
+ "sharedDescription": "Kuvaus",
+ "sharedSearch": "Haku",
+ "sharedIconScale": "Kuvakkeiden skaalaus",
+ "sharedGeofence": "Geoaita",
+ "sharedGeofences": "Geoaidat",
+ "sharedCreateGeofence": "Luo geoaita",
+ "sharedNotifications": "Ilmoitukset",
+ "sharedNotification": "Ilmoitus",
+ "sharedAttributes": "Ominaisuudet",
+ "sharedAttribute": "Ominaisuus",
+ "sharedDrivers": "Kuljettajat",
+ "sharedDriver": "Kuljettaja",
+ "sharedArea": "Alue",
+ "sharedSound": "Ilmoitusääni",
+ "sharedType": "Tyyppi",
+ "sharedDistance": "Matka",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gallona",
+ "sharedLiter": "Litra",
+ "sharedImpGallon": "Brittiläinen gallona",
+ "sharedUsGallon": "Amerikkalainen gallona",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Hae kartan tila",
+ "sharedComputedAttribute": "Laskettu ominaisuus",
+ "sharedComputedAttributes": "Lasketut ominaisuudet",
+ "sharedCheckComputedAttribute": "Tarkista laskettu ominaisuus",
+ "sharedExpression": "Lauseke",
+ "sharedDevice": "Laite",
+ "sharedTest": "Testaa",
+ "sharedTestNotification": "Lähetä testi-ilmoitus",
+ "sharedTestNotificators": "Testaa kanavia",
+ "sharedTestExpression": "Testaa lauseke",
+ "sharedCalendar": "Kalenteri",
+ "sharedCalendars": "Kalenterit",
+ "sharedFile": "Tiedosto",
+ "sharedSearchDevices": "Etsi laitteita",
+ "sharedSortBy": "Lajittele",
+ "sharedFilterMap": "Suodata kartalla",
+ "sharedSelectFile": "Valitse tiedosto",
+ "sharedPhone": "Puhelin",
+ "sharedRequired": "Vaadittavat",
+ "sharedPreferences": "Asetukset",
+ "sharedPermissions": "Käyttöoikeudet",
+ "sharedConnections": "Yhteydet",
+ "sharedExtra": "Ekstra",
+ "sharedPrimary": "Ensisijainen",
+ "sharedSecondary": "Toissijainen",
+ "sharedTypeString": "Merkkijono",
+ "sharedTypeNumber": "Numero",
+ "sharedTypeBoolean": "Totuusarvo",
+ "sharedTimezone": "Aikavyöhyke",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Tallennettu komento",
+ "sharedSavedCommands": "Tallennetut komennot",
+ "sharedNew": "Uusi...",
+ "sharedShowAddress": "Näytä osoite",
+ "sharedShowDetails": "Lisätietoja",
+ "sharedDisabled": "Poistettu käytöstä",
+ "sharedMaintenance": "Huolto",
+ "sharedDeviceAccumulators": "Laskurit",
+ "sharedAlarms": "Hälytykset",
+ "sharedLocation": "Sijainti",
+ "sharedImport": "Tuo",
+ "sharedColumns": "Sarakkeet",
+ "sharedDropzoneText": "Vedä ja pudota tiedosto tähän tai klikkaa",
+ "sharedLogs": "Lokit",
+ "sharedLink": "Link",
+ "calendarSimple": "Yksinkertainen",
+ "calendarRecurrence": "Toisto",
+ "calendarOnce": "Kerran",
+ "calendarDaily": "Päivittäin",
+ "calendarWeekly": "Viikoittain",
+ "calendarMonthly": "Kuukausittain",
+ "calendarDays": "Päivät",
+ "calendarSunday": "Sunnuntai",
+ "calendarMonday": "Maanantai",
+ "calendarTuesday": "Tiistai",
+ "calendarWednesday": "Keskiviikko",
+ "calendarThursday": "Torstai",
+ "calendarFriday": "Perjantai",
+ "calendarSaturday": "Lauantai",
+ "attributeShowGeofences": "Näytä geoaita",
+ "attributeSpeedLimit": "Nopeusrajoitus",
+ "attributeFuelDropThreshold": "Polttoaineen vähenemisen raja-arvo",
+ "attributeFuelIncreaseThreshold": "Polttoaineen lisäämisen raja-arvo",
+ "attributePolylineDistance": "Etäisyys murtoviivaan",
+ "attributeReportIgnoreOdometer": "Raportti: Älä huomioi matkamittaria",
+ "attributeWebReportColor": "Web: Raportin väri",
+ "attributeDevicePassword": "Laitteen salasana",
+ "attributeDeviceImage": "Laitteen kuva",
+ "attributeDeviceInactivityStart": "Laitteen epäaktiivisuuden alku",
+ "attributeDeviceInactivityPeriod": "Laitteen epäaktiivisuuden jakso",
+ "attributeProcessingCopyAttributes": "Laskenta: Kopioi ominaisuudet",
+ "attributeColor": "Väri",
+ "attributeWebLiveRouteLength": "Web: Live-reitin pituus",
+ "attributeWebSelectZoom": "Web: Lähennys valittaessa",
+ "attributeWebMaxZoom": "Web: Suurin lähennys",
+ "attributeTelegramChatId": "Telegram keskustelu ID",
+ "attributePushoverUserKey": "Pushover käyttäjäavain",
+ "attributePushoverDeviceNames": "Pushover laitteiden nimet",
+ "attributeMailSmtpHost": "Email: SMTP-isäntäpalvelin",
+ "attributeMailSmtpPort": "Email: SMTP-portti",
+ "attributeMailSmtpStarttlsEnable": "Email: SMTP STARTTLS:n aktivointi",
+ "attributeMailSmtpStarttlsRequired": "Email: SMTP STARTTLS vaaditaan",
+ "attributeMailSmtpSslEnable": "Email: SMTP SSL:n aktivointi",
+ "attributeMailSmtpSslTrust": "Email: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Email: SMTP SSL -protokollat",
+ "attributeMailSmtpFrom": "Email: SMTP-lähettäjä",
+ "attributeMailSmtpAuth": "Email: SMTP-tunnistautumisen aktivointi",
+ "attributeMailSmtpUsername": "Email: SMTP-käyttäjätunnus",
+ "attributeMailSmtpPassword": "Email: SMTP-salasana",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Piilota ominaisuudet",
+ "attributeUiDisableGroups": "UI: Piilota ryhmät",
+ "attributeUiDisableEvents": "UI: Piilota tapahtumat",
+ "attributeUiDisableVehicleFeatures": "UI: Piilota ajoneuvon omainaisuudet",
+ "attributeUiDisableDrivers": "UI: Piilota kuljettajat",
+ "attributeUiDisableComputedAttributes": "UI: Piilota lasketut ominaisuudet",
+ "attributeUiDisableCalendars": "UI: Piilota kalenterit",
+ "attributeUiDisableMaintenance": "UI: Piilota huolto",
+ "attributeUiHidePositionAttributes": "UI: Piilota sijainnin ominaisuudet",
+ "attributeUiDisableLoginLanguage": "UI: Piilota kielivalinta kirjautumisesta",
+ "attributeNotificationTokens": "Ilmoitustunnukset",
+ "attributePopupInfo": "Popup tiedot",
+ "errorTitle": "Virhe",
+ "errorGeneral": "Epäkelvot parametrit tai rajoitteiden rikkomus",
+ "errorConnection": "Yhteysvirhe",
+ "errorSocket": "WebSocket-yhteysvirhe",
+ "errorZero": "Ei voi olla nolla",
+ "userEmail": "Sähköposti",
+ "userPassword": "Salasana",
+ "userAdmin": "Ylläpito",
+ "userRemember": "Muista",
+ "userExpirationTime": "Vanheneminen",
+ "userDeviceLimit": "Laiteraja",
+ "userUserLimit": "Käyttäjäraja",
+ "userDeviceReadonly": "Laitteet vain luettavissa",
+ "userLimitCommands": "Rajoita komentoja",
+ "userDisableReports": "Poista raportit käytöstä",
+ "userFixedEmail": "Ei sähköpostiosoitteen vaihtoa",
+ "userToken": "Todennustunnus",
+ "userDeleteAccount": "Poista tili",
+ "userTemporary": "Temporary",
+ "loginTitle": "Kirjaudu",
+ "loginLanguage": "Kieli",
+ "loginReset": "Nollaa salasana",
+ "loginRegister": "Rekisteröidy",
+ "loginLogin": "Kirjaudu",
+ "loginOpenId": "Kirjaudu OpenID:llä",
+ "loginFailed": "Virheellinen sähköposti tai salasana",
+ "loginCreated": "Uusi käyttäjä on rekisteröity",
+ "loginResetSuccess": "Tarkista sähköpostisi",
+ "loginUpdateSuccess": "Uusi salasana asetettu",
+ "loginLogout": "Kirjaudu ulos",
+ "loginLogo": "Logo",
+ "loginTotpCode": "Kertakäyttö salasana koodi",
+ "loginTotpKey": "Kertakäyttö salasanan avain",
+ "devicesAndState": "Laitteet ja Tilat",
+ "deviceSelected": "Valitse laite",
+ "deviceTitle": "Laitteet",
+ "devicePrimaryInfo": "Laitteen nimi",
+ "deviceSecondaryInfo": "Laitteen tiedot",
+ "deviceIdentifier": "Tunniste",
+ "deviceModel": "Malli",
+ "deviceContact": "Yhteyshenkilö",
+ "deviceCategory": "Kategoria",
+ "deviceLastUpdate": "Viimeisin päivitys",
+ "deviceCommand": "Komento",
+ "deviceFollow": "Seuraa",
+ "deviceTotalDistance": "Kokonaismatka",
+ "deviceStatus": "Tila",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Tuntematon",
+ "deviceRegisterFirst": "Rekisteröi ensimmäinen laitteesi",
+ "deviceIdentifierHelp": "IMEI, sarjanumeo tai muu id. ID:n pitää täsmätä laitteen lähettämään tunnisteeseen.",
+ "deviceShare": "Jaa laitteen sijainti",
+ "groupDialog": "Ryhmä",
+ "groupParent": "Ryhmä",
+ "groupNoGroup": "Ei ryhmää",
+ "settingsTitle": "Asetukset",
+ "settingsUser": "Tili",
+ "settingsGroups": "Ryhmät",
+ "settingsServer": "Palvelin",
+ "settingsUsers": "Käyttäjät",
+ "settingsDistanceUnit": "Matkayksikkö",
+ "settingsAltitudeUnit": "Korkeusyksikkö",
+ "settingsSpeedUnit": "Nopeusyksikkö",
+ "settingsVolumeUnit": "Tilavuusyksikkö",
+ "settingsTwelveHourFormat": "12-tunnin formaatti",
+ "settingsCoordinateFormat": "Koordinaattien formaatti",
+ "settingsServerVersion": "Palvelin versio",
+ "settingsAppVersion": "Sovellus versio",
+ "settingsConnection": "Yhteys",
+ "settingsDarkMode": "Tumma tila",
+ "settingsTotpEnable": "Ota käyttöön kertakäyttö salasana",
+ "settingsTotpForce": "Pakota kertakäyttöinen salasana",
+ "settingsServiceWorkerUpdateInterval": "Palvelun päivitysväli",
+ "settingsUpdateAvailable": "Päivitys saatavilla",
+ "settingsSupport": "Tuki",
+ "reportTitle": "Raportit",
+ "reportScheduled": "Ajastetut raportit",
+ "reportDevice": "Laite",
+ "reportGroup": "Ryhmä",
+ "reportFrom": "Mistä",
+ "reportTo": "Mihin",
+ "reportShow": "Näytä",
+ "reportClear": "Tyhjennä",
+ "linkGoogleMaps": "Google kartat",
+ "linkAppleMaps": "Apple kartat",
+ "linkStreetView": "Katunäkymä",
+ "positionFixTime": "Sijaintiaika",
+ "positionDeviceTime": "Laitteen aika",
+ "positionServerTime": "Palvelimen aika",
+ "positionValid": "Kelvollinen",
+ "positionAccuracy": "Tarkkuus",
+ "positionLatitude": "Leveysaste",
+ "positionLongitude": "Pituusaste",
+ "positionAltitude": "Korkeus",
+ "positionSpeed": "Nopeus",
+ "positionCourse": "Suunta",
+ "positionAddress": "Osoite",
+ "positionProtocol": "Protokolla",
+ "positionDistance": "Matka",
+ "positionRpm": "RPM",
+ "positionFuel": "Polttoaine",
+ "positionPower": "Virta",
+ "positionBattery": "Akku",
+ "positionRaw": "Raaka",
+ "positionIndex": "Indeksi",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelliitteja",
+ "positionSatVisible": "Näkyviä satelliitteja",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Verkkovierailu",
+ "positionEvent": "Tapahtuma",
+ "positionAlarm": "Hälytys",
+ "positionStatus": "Tila",
+ "positionOdometer": "Matkamittari",
+ "positionServiceOdometer": "Huollon matkamittari",
+ "positionTripOdometer": "Trippimittari",
+ "positionHours": "Tuntia",
+ "positionSteps": "Askeleita",
+ "positionInput": "Sisääntulo",
+ "positionHeartRate": "Syke",
+ "positionOutput": "Ulostulo",
+ "positionBatteryLevel": "Akun varaus",
+ "positionFuelConsumption": "Polttoaineen kulutus",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Laiteohjelmiston versio",
+ "positionVersionHw": "Laitteiston versio",
+ "positionIgnition": "Virta (sytytys)",
+ "positionFlags": "Liput",
+ "positionCharge": "Lataus",
+ "positionIp": "IP-osoite",
+ "positionArchive": "Arkisto",
+ "positionVin": "VIN",
+ "positionApproximate": "Likimääräinen",
+ "positionThrottle": "Kaasupoljin",
+ "positionMotion": "Liike",
+ "positionArmed": "Hälytys kytketty",
+ "positionAcceleration": "Kiihtyvyys",
+ "positionTemp": "Lämpötila",
+ "positionDeviceTemp": "Laitteen lämpötila",
+ "positionCoolantTemp": "Jäähdytysnesteen lämpötila",
+ "positionOperator": "Operaattori",
+ "positionCommand": "Komento",
+ "positionBlocked": "Estetty",
+ "positionDtcs": "DTC:t",
+ "positionObdSpeed": "OBD-nopeus",
+ "positionObdOdometer": "OBD-matkamittari",
+ "positionDrivingTime": "Ajoaika",
+ "positionDriverUniqueId": "Kuljettajan ID",
+ "positionCard": "Kortti",
+ "positionImage": "Kuva",
+ "positionVideo": "Video",
+ "positionAudio": "Ääni",
+ "serverTitle": "Palvelinasetukset",
+ "serverZoom": "Lähennys",
+ "serverRegistration": "Rekisteröinti",
+ "serverReadonly": "Vain luku",
+ "serverForceSettings": "Pakota asetukset",
+ "serverAnnouncement": "Ilmoitus",
+ "serverName": "Palvelimen nimi",
+ "serverDescription": "Palvelimen kuvaus",
+ "serverColorPrimary": "Ensisijainen väri",
+ "serverColorSecondary": "Toissijainen väri",
+ "serverLogo": "Logo kuva",
+ "serverLogoInverted": "Logo kuva negatiivinen",
+ "serverChangeDisable": "Estä palvelimen vaihto",
+ "serverDisableShare": "Estä laitteen jakaminen",
+ "mapTitle": "Kartta",
+ "mapActive": "Aktiiviset kartat",
+ "mapOverlay": "Karttapäällys",
+ "mapOverlayCustom": "Oma karttapäällys",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API-avain",
+ "mapOpenWeatherClouds": "OpenWeather pilvet",
+ "mapOpenWeatherPrecipitation": "OpenWeather sade",
+ "mapOpenWeatherPressure": "OpenWeather ilmanpaine",
+ "mapOpenWeatherWind": "OpenWeather tuuli",
+ "mapOpenWeatherTemperature": "OpenWeather lämpötila",
+ "mapLayer": "Karttataso",
+ "mapCustom": "Oma kartta (XYZ)",
+ "mapCustomArcgis": "Oma kartta (ArcGIS)",
+ "mapCustomLabel": "Oma kartta",
+ "mapCarto": "Carto-pohjakartat",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google katukartta",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google ilmakuva",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps -avain",
+ "mapBingRoad": "Bing Maps -tiet",
+ "mapBingAerial": "Bing Maps -ilmakuva",
+ "mapBingHybrid": "Bing Maps -hybridi",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex-kartta",
+ "mapYandexSat": "Yandex-satelliittikuva",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox kadut",
+ "mapMapboxStreetsDark": "Mapbox Streets tumma",
+ "mapMapboxOutdoors": "Mapbox ulkoilu",
+ "mapMapboxSatellite": "Mapbox satelliitti",
+ "mapMapboxKey": "Mapbox pääsyavain",
+ "mapMapTilerBasic": "MapTile perus",
+ "mapMapTilerHybrid": "MapTiler hybrid",
+ "mapMapTilerKey": "MapTiler API-avain",
+ "mapLocationIqStreets": "LocationIQ kadut",
+ "mapLocationIqDark": "LocationIQ tumma",
+ "mapLocationIqKey": "LocationIQ pääsyavain",
+ "mapTomTomBasic": "TomTom perus",
+ "mapTomTomFlow": "TomTom liikenne",
+ "mapTomTomIncidents": "TomTom liikenneonnettomuudet",
+ "mapTomTomKey": "TomTom API-avain",
+ "mapHereBasic": "Here perus",
+ "mapHereHybrid": "Here hybrid",
+ "mapHereSatellite": "Here satellitti",
+ "mapHereFlow": "Here liikenne",
+ "mapHereKey": "Here API-avain",
+ "mapShapePolygon": "Monikulmio",
+ "mapShapeCircle": "Ympyrä",
+ "mapShapePolyline": "Murtoviiva",
+ "mapLiveRoutes": "Live-reitit",
+ "mapDirection": "Näytä suunta",
+ "mapCurrentLocation": "Nykyinen sijainti",
+ "mapPoiLayer": "Kohdepistetaso",
+ "mapClustering": "Merkkien ryvästäminen",
+ "mapOnSelect": "Näytä kartta valittaessa",
+ "mapDefault": "Oletus kartta",
+ "stateTitle": "Tila",
+ "stateName": "Ominaisuus",
+ "stateValue": "Arvo",
+ "commandTitle": "Komento",
+ "commandSend": "Lähetä",
+ "commandSent": "Komento lähetetty",
+ "commandQueued": "Komento jonossa",
+ "commandUnit": "Yksikkö",
+ "commandCustom": "Oma komento",
+ "commandDeviceIdentification": "Laitteen tunnistus",
+ "commandPositionSingle": "Yksittäinen raportointi",
+ "commandPositionPeriodic": "Määräaikaisraportointi",
+ "commandPositionStop": "Lopeta raportointi",
+ "commandEngineStop": "Sammuta moottori",
+ "commandEngineResume": "Palauta moottori",
+ "commandAlarmArm": "Hälytys päälle",
+ "commandAlarmDisarm": "Hälytys pois",
+ "commandAlarmDismiss": "Hylkää hälytys",
+ "commandSetTimezone": "Aseta aikavyöhyke",
+ "commandRequestPhoto": "Pyydä kuva",
+ "commandPowerOff": "Sammuta laite",
+ "commandRebootDevice": "Käynnistä laite uudelleen",
+ "commandFactoryReset": "Tehdasasetusten palautus",
+ "commandSendSms": "Lähetä tekstiviesti",
+ "commandSendUssd": "Lähetä USSD",
+ "commandSosNumber": "Aseta SOS-numero",
+ "commandSilenceTime": "Aseta hiljainen aika",
+ "commandSetPhonebook": "Aseta osoitekirja",
+ "commandVoiceMessage": "Ääniviesti",
+ "commandOutputControl": "Ulostulon ohjaus",
+ "commandVoiceMonitoring": "Äänitarkkailu",
+ "commandSetAgps": "Aseta AGPS",
+ "commandSetIndicator": "Aseta indikaattori",
+ "commandConfiguration": "Konfigurointi",
+ "commandGetVersion": "Pyydä versio",
+ "commandFirmwareUpdate": "Päivitä laiteohjelmisto",
+ "commandSetConnection": "Aseta yhteys",
+ "commandSetOdometer": "Aseta matkamittari",
+ "commandGetModemStatus": "Pyydä modeemin tila",
+ "commandGetDeviceStatus": "Pyydä laitteen tila",
+ "commandSetSpeedLimit": "Aseta nopeusrajoitus",
+ "commandModePowerSaving": "Virransäästötila",
+ "commandModeDeepSleep": "Syväunitila",
+ "commandAlarmGeofence": "Aseta geoaitahälytys",
+ "commandAlarmBattery": "Aseta akkuhälytys",
+ "commandAlarmSos": "Aseta SOS-hälytys",
+ "commandAlarmRemove": "Aseta poistettu hälytys",
+ "commandAlarmClock": "Aseta aikahälytys",
+ "commandAlarmSpeed": "Aseta nopeushälytys",
+ "commandAlarmFall": "Aseta kaatumishälytys",
+ "commandAlarmVibration": "Aseta tärinähälytys",
+ "commandFrequency": "Taajuus",
+ "commandTimezone": "Aikavyöhykkeen poikkeama",
+ "commandMessage": "Viesti",
+ "commandRadius": "Säde",
+ "commandEnable": "Ota käyttöön",
+ "commandData": "Tieto",
+ "commandIndex": "Indeksi",
+ "commandPhone": "Puhelinnumero",
+ "commandServer": "Palvelin",
+ "commandPort": "Portti",
+ "eventAll": "Kaikki tapahtumat",
+ "eventDeviceOnline": "Tila online",
+ "eventDeviceUnknown": "Tila tuntematon",
+ "eventDeviceOffline": "Tila offline",
+ "eventDeviceInactive": "Laite epäaktiivinen",
+ "eventQueuedCommandSent": "Jonossa oleva komento lähetetty",
+ "eventDeviceMoving": "Laite liikkuu",
+ "eventDeviceStopped": "Laite pysähtynyt",
+ "eventDeviceOverspeed": "Nopeusrajoitus ylitetty",
+ "eventDeviceFuelDrop": "Polttoaineen väheneminen",
+ "eventDeviceFuelIncrease": "Polttoaineen lisääminen",
+ "eventCommandResult": "Komennon tulos",
+ "eventGeofenceEnter": "Laite saapui geoaitaan",
+ "eventGeofenceExit": "Laite poistui geoaidasta",
+ "eventAlarm": "Hälytykset",
+ "eventIgnitionOn": "Sytytysvirta päällä",
+ "eventIgnitionOff": "Sytytysvirta pois päältä",
+ "eventMaintenance": "Huoltoa tarvitaan",
+ "eventTextMessage": "Tekstiviesti vastaanotettu",
+ "eventDriverChanged": "Kuljettaja vaihtunut",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Vieritä viimeiseen",
+ "eventsSoundEvents": "Ääni tapahtumat",
+ "eventsSoundAlarms": "Ääni hälytykset",
+ "alarmGeneral": "Yleinen",
+ "alarmSos": "SOS",
+ "alarmVibration": "Tärinä",
+ "alarmMovement": "Liike",
+ "alarmLowspeed": "Alhainen nopeus",
+ "alarmOverspeed": "Ylinopeus",
+ "alarmFallDown": "Kaatuminen",
+ "alarmLowPower": "Alhainen virta",
+ "alarmLowBattery": "Alhainen akun varaus",
+ "alarmFault": "Vikaantuminen",
+ "alarmPowerOff": "Virran sammutus",
+ "alarmPowerOn": "Virran käynnistys",
+ "alarmDoor": "Ovi",
+ "alarmLock": "Lukittu",
+ "alarmUnlock": "Lukitus avattu",
+ "alarmGeofence": "Geoaita",
+ "alarmGeofenceEnter": "Geoaitaan saapuminen",
+ "alarmGeofenceExit": "Geoaidasta poistuminen",
+ "alarmGpsAntennaCut": "GPS antennivika",
+ "alarmAccident": "Onnettomuus",
+ "alarmTow": "Hinaus",
+ "alarmIdle": "Tyhjäkäynti",
+ "alarmHighRpm": "Korkea kierrosluku",
+ "alarmHardAcceleration": "Nopea kiihdytys",
+ "alarmHardBraking": "Nopea jarrutus",
+ "alarmHardCornering": "Kova käännös",
+ "alarmLaneChange": "Kaistan vaihto",
+ "alarmFatigueDriving": "Väsyneenä ajaminen",
+ "alarmPowerCut": "Sähkökatko",
+ "alarmPowerRestored": "Sähkökatkon loppuminen",
+ "alarmJamming": "Häirintä",
+ "alarmTemperature": "Lämpötila",
+ "alarmParking": "Pysäköinti",
+ "alarmBonnet": "Konepelti",
+ "alarmFootBrake": "Jalkajarru",
+ "alarmFuelLeak": "Polttoainevuoto",
+ "alarmTampering": "Peukalointi",
+ "alarmRemoving": "Siirto",
+ "notificationType": "Ilmoituksen tyyppi",
+ "notificationAlways": "Kaikki laitteet",
+ "notificationNotificators": "Kanavat",
+ "notificatorCommand": "Komento",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Sähköposti",
+ "notificatorSms": "Tekstiviesti",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Toista",
+ "reportCombined": "Yhdistelmä",
+ "reportRoute": "Reitti",
+ "reportEvents": "Tapahtumat",
+ "reportTrips": "Matkat",
+ "reportStops": "Pysähdykset",
+ "reportSummary": "Yhteenveto",
+ "reportDaily": "Päivittäinen yhteenveto",
+ "reportChart": "Kuvaaja",
+ "reportConfigure": "Konfiguroi",
+ "reportEventTypes": "Tapahtumatyypit",
+ "reportChartType": "Kuvaajatyypit",
+ "reportShowMarkers": "Näytä merkit",
+ "reportExport": "Vie",
+ "reportEmail": "Sähköpostiraportti",
+ "reportSchedule": "Ajastettu",
+ "reportPeriod": "Jakso",
+ "reportCustom": "Oma",
+ "reportToday": "Tänään",
+ "reportYesterday": "Eilen",
+ "reportThisWeek": "Tällä viikolla",
+ "reportPreviousWeek": "Viime viikolla",
+ "reportThisMonth": "Tässä kuussa",
+ "reportPreviousMonth": "Viime kuussa",
+ "reportDeviceName": "Laitteen nimi",
+ "reportAverageSpeed": "Keskinopeus",
+ "reportMaximumSpeed": "Suurin nopeus",
+ "reportEngineHours": "Käyttötunnit",
+ "reportDuration": "Kesto",
+ "reportStartDate": "Aloituspäivä",
+ "reportStartTime": "Aloitusaika",
+ "reportStartAddress": "Aloitusosoite",
+ "reportEndTime": "Lopetusaika",
+ "reportEndAddress": "Lopetusosoite",
+ "reportSpentFuel": "Käytetty polttoaine",
+ "reportStartOdometer": "Matkamittari alussa",
+ "reportEndOdometer": "Matkamittari lopussa",
+ "statisticsTitle": "Tilastot",
+ "statisticsCaptureTime": "Tarkasteluaika",
+ "statisticsActiveUsers": "Aktiivisia käyttäjiä",
+ "statisticsActiveDevices": "Aktiivisia laitteita",
+ "statisticsRequests": "Pyyntöjä",
+ "statisticsMessagesReceived": "Viestejä vastaanotettu",
+ "statisticsMessagesStored": "Viestejä tallennettu",
+ "statisticsGeocoder": "Geokoodauspyyntöjä",
+ "statisticsGeolocation": "Sijaintipyyntöjä",
+ "categoryArrow": "Nuoli",
+ "categoryDefault": "Oletus",
+ "categoryAnimal": "Eläin",
+ "categoryBicycle": "Polkupyörä",
+ "categoryBoat": "Vene",
+ "categoryBus": "Bussi",
+ "categoryCar": "Auto",
+ "categoryCamper": "Matkailuajoneuvo",
+ "categoryCrane": "Nosturi",
+ "categoryHelicopter": "Helikopteri",
+ "categoryMotorcycle": "Moottoripyörä",
+ "categoryOffroad": "Maastoajoneuvo",
+ "categoryPerson": "Henkilö",
+ "categoryPickup": "Lava-auto",
+ "categoryPlane": "Lentokone",
+ "categoryShip": "Laiva",
+ "categoryTractor": "Traktori",
+ "categoryTrain": "Juna",
+ "categoryTram": "Raitiovaunu",
+ "categoryTrolleybus": "Johdinauto",
+ "categoryTruck": "Kuorma-auto",
+ "categoryVan": "Pakettiauto",
+ "categoryScooter": "Potkulauta",
+ "maintenanceStart": "Alku",
+ "maintenancePeriod": "Huoltoväli"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/fr.json b/legacy/web/l10n/fr.json
new file mode 100644
index 00000000..1e9147ae
--- /dev/null
+++ b/legacy/web/l10n/fr.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Chargement...",
+ "sharedHide": "Cacher",
+ "sharedSave": "Enregistrer",
+ "sharedUpload": "Upload",
+ "sharedSet": "Régler",
+ "sharedCancel": "Annuler",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Ajouter",
+ "sharedEdit": "Editer",
+ "sharedRemove": "Effacer",
+ "sharedRemoveConfirm": "Effacer objet?",
+ "sharedNoData": "Aucune donnée",
+ "sharedSubject": "Subject",
+ "sharedYes": "Oui",
+ "sharedNo": "Non",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "nd",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Heure",
+ "sharedMinute": "Minute",
+ "sharedSecond": "Seconde",
+ "sharedDays": "jours",
+ "sharedHours": "heures",
+ "sharedMinutes": "minutes",
+ "sharedDecimalDegrees": "Degrés Décimaux",
+ "sharedDegreesDecimalMinutes": "Degrés Décimaux Minutes",
+ "sharedDegreesMinutesSeconds": "Degrés Minutes Secondes",
+ "sharedName": "Nom",
+ "sharedDescription": "Description",
+ "sharedSearch": "Recherche",
+ "sharedIconScale": "Echelle des icônes",
+ "sharedGeofence": "Périmètre virtuel",
+ "sharedGeofences": "Périmètres virtuels",
+ "sharedCreateGeofence": "Créé un périmètre virtuel",
+ "sharedNotifications": "Notifications",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "Attributs",
+ "sharedAttribute": "Attribut",
+ "sharedDrivers": "Pilotes",
+ "sharedDriver": "Pilote",
+ "sharedArea": "Aire",
+ "sharedSound": "Son de notification",
+ "sharedType": "Type",
+ "sharedDistance": "Distance",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Litre",
+ "sharedImpGallon": "Gallon impérial",
+ "sharedUsGallon": "Gallon US",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "État de la carte",
+ "sharedComputedAttribute": "Attribut calculé",
+ "sharedComputedAttributes": "Attributs calculés",
+ "sharedCheckComputedAttribute": "Verifier l'attribut calculé",
+ "sharedExpression": "Expression",
+ "sharedDevice": "Appareil",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Test d'envoi de notification",
+ "sharedTestNotificators": "Test canaux",
+ "sharedTestExpression": "Test expression",
+ "sharedCalendar": "Calendrier",
+ "sharedCalendars": "Calendriers",
+ "sharedFile": "Fichier",
+ "sharedSearchDevices": "Recherche appareils",
+ "sharedSortBy": "Trier par",
+ "sharedFilterMap": "Filtrer sur la carte",
+ "sharedSelectFile": "Sélectionner un fichier",
+ "sharedPhone": "Téléphone",
+ "sharedRequired": "Requis",
+ "sharedPreferences": "Préférences",
+ "sharedPermissions": "Permissions",
+ "sharedConnections": "Connexions",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primaire",
+ "sharedSecondary": "Secondaire",
+ "sharedTypeString": "Chaîne de caractères",
+ "sharedTypeNumber": "Nombre",
+ "sharedTypeBoolean": "Booléen",
+ "sharedTimezone": "Fuseau horaire",
+ "sharedInfoTitle": "Information",
+ "sharedSavedCommand": "Commande sauvegardée",
+ "sharedSavedCommands": "Commandes sauvegardées",
+ "sharedNew": "Nouveau",
+ "sharedShowAddress": "Montrer adresse",
+ "sharedShowDetails": "Plus de détails",
+ "sharedDisabled": "Désactivé",
+ "sharedMaintenance": "Entretien",
+ "sharedDeviceAccumulators": "Accumulateurs",
+ "sharedAlarms": "Alarmes",
+ "sharedLocation": "Localisation",
+ "sharedImport": "Importer",
+ "sharedColumns": "Colonnes",
+ "sharedDropzoneText": "Glissez et déposez un fichier ici ou cliquez",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Récurrence",
+ "calendarOnce": "Une fois",
+ "calendarDaily": "Journalier",
+ "calendarWeekly": "Hebdomadaire",
+ "calendarMonthly": "Mensuel",
+ "calendarDays": "Jours",
+ "calendarSunday": "Dimanche",
+ "calendarMonday": "Lundi",
+ "calendarTuesday": "Mardi",
+ "calendarWednesday": "Mercredi",
+ "calendarThursday": "Jeudi",
+ "calendarFriday": "Vendredi",
+ "calendarSaturday": "Samedi",
+ "attributeShowGeofences": "Afficher les périmètres virtuels",
+ "attributeSpeedLimit": "Limite de vitesse",
+ "attributeFuelDropThreshold": "Seuil perte de carburant",
+ "attributeFuelIncreaseThreshold": "Seuil ajout de carburant",
+ "attributePolylineDistance": "Distance polyligne",
+ "attributeReportIgnoreOdometer": "Rapport: Ignorer l'odomètre",
+ "attributeWebReportColor": "Web: couleur du rapport",
+ "attributeDevicePassword": "Mot de passe de l'appareil",
+ "attributeDeviceImage": "Image de l'appareil",
+ "attributeDeviceInactivityStart": "Début d'inactivité de l'appareil",
+ "attributeDeviceInactivityPeriod": "Période d'inactivité de l'appareil",
+ "attributeProcessingCopyAttributes": "En cours: Copie des attributs",
+ "attributeColor": "Couleur",
+ "attributeWebLiveRouteLength": "Web: Longueur de route en temps réel",
+ "attributeWebSelectZoom": "Web: Zoomer à la sélection",
+ "attributeWebMaxZoom": "Web: Zoom maximum",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover Clé Utilisateur",
+ "attributePushoverDeviceNames": "Pushover Noms d'appareils",
+ "attributeMailSmtpHost": "Mail: Hôte SMTP",
+ "attributeMailSmtpPort": "Mail: Port SMTP",
+ "attributeMailSmtpStarttlsEnable": "Mail: Activer SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "Mail: Requérir SMTP STARTTLS",
+ "attributeMailSmtpSslEnable": "Mail: Activer SMTP SSL",
+ "attributeMailSmtpSslTrust": "Mail: Trust SMTP SSL",
+ "attributeMailSmtpSslProtocols": "Mail: Protocoles SMTP SSL",
+ "attributeMailSmtpFrom": "Mail: SMTP From",
+ "attributeMailSmtpAuth": "Mail: Activer l'authentification",
+ "attributeMailSmtpUsername": "Mail: Nom d'utilisateur",
+ "attributeMailSmtpPassword": "Mail: Mot de passe",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Désactiver les attributs",
+ "attributeUiDisableGroups": "UI: Désactiver groupes",
+ "attributeUiDisableEvents": "UI: Désactiver évènements",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Désactiver les conducteurs",
+ "attributeUiDisableComputedAttributes": "UI: Désactiver les attributs calculés",
+ "attributeUiDisableCalendars": "UI: Désactiver les calendiers",
+ "attributeUiDisableMaintenance": "UI: Désactiver l'entretien",
+ "attributeUiHidePositionAttributes": "UI: Cacher Attributs de Position",
+ "attributeUiDisableLoginLanguage": "UI: Désactiver choix des languges",
+ "attributeNotificationTokens": "Jeton de notification",
+ "attributePopupInfo": "Informations dans popup",
+ "errorTitle": "Erreur",
+ "errorGeneral": "Paramètres invalides ou violation de contrainte",
+ "errorConnection": "Erreur de connexion",
+ "errorSocket": "Erreur de connexion au socket web",
+ "errorZero": "Ne peut être zéro",
+ "userEmail": "Email",
+ "userPassword": "Mot de Passe",
+ "userAdmin": "Admin",
+ "userRemember": "Rappel",
+ "userExpirationTime": "Expiration",
+ "userDeviceLimit": "Limite de l'appareil",
+ "userUserLimit": "Limite d'utilisateurs",
+ "userDeviceReadonly": "Appareil - Lecture seule",
+ "userLimitCommands": "Commandes de limite",
+ "userDisableReports": "Désactiver les rapports",
+ "userFixedEmail": "Changement d'email bloqué",
+ "userToken": "Jeton",
+ "userDeleteAccount": "Supprimer le compte",
+ "userTemporary": "Temporary",
+ "loginTitle": "Identification",
+ "loginLanguage": "Langue",
+ "loginReset": "Réinitialiser le mot de passe",
+ "loginRegister": "Inscription",
+ "loginLogin": "Se connecter",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Adresse email ou mot de passe incorrect",
+ "loginCreated": "Nouvel utilisateur enregistré",
+ "loginResetSuccess": "Vérifiez vos emails",
+ "loginUpdateSuccess": "Le nouveau mot de passe est défini",
+ "loginLogout": "Déconnexion",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Appareils et État",
+ "deviceSelected": "Appareil sélectionné",
+ "deviceTitle": "Appareils",
+ "devicePrimaryInfo": "Titre de l'appareil",
+ "deviceSecondaryInfo": "Détail de l'appareil",
+ "deviceIdentifier": "Identifiant",
+ "deviceModel": "Modèle",
+ "deviceContact": "Contact",
+ "deviceCategory": "Catégorie",
+ "deviceLastUpdate": "Dernière mise à jour",
+ "deviceCommand": "Commande",
+ "deviceFollow": "Suivre",
+ "deviceTotalDistance": "Distance totale",
+ "deviceStatus": "Statut",
+ "deviceStatusOnline": "En ligne",
+ "deviceStatusOffline": "Hors ligne",
+ "deviceStatusUnknown": "Inconnu",
+ "deviceRegisterFirst": "Enregistrez votre premier appareil",
+ "deviceIdentifierHelp": "IMEI, numéro de série ou autre id. Cela doit correspondre à l'identifiant avec lequel l'appareil envoie ses données au serveur.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Groupe",
+ "groupParent": "Groupe",
+ "groupNoGroup": "Sans groupe",
+ "settingsTitle": "Paramètres",
+ "settingsUser": "Compte",
+ "settingsGroups": "Groupes",
+ "settingsServer": "Serveur",
+ "settingsUsers": "Utilisateurs",
+ "settingsDistanceUnit": "Unité de distance",
+ "settingsAltitudeUnit": "Unité d'altitude",
+ "settingsSpeedUnit": "Unité de vitesse",
+ "settingsVolumeUnit": "Unité de volume",
+ "settingsTwelveHourFormat": "Format d'heure - 12 heures",
+ "settingsCoordinateFormat": "Format des coordonées",
+ "settingsServerVersion": "Version serveur",
+ "settingsAppVersion": "Version application",
+ "settingsConnection": "Connexion",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Rapports",
+ "reportScheduled": "Rapports programmés",
+ "reportDevice": "Appareil",
+ "reportGroup": "Groupe",
+ "reportFrom": "De",
+ "reportTo": "À",
+ "reportShow": "Afficher",
+ "reportClear": "Effacer",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Plans",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Horodatage",
+ "positionDeviceTime": "Heure de l'appareil",
+ "positionServerTime": "Heure du serveur",
+ "positionValid": "Valide",
+ "positionAccuracy": "Précision",
+ "positionLatitude": "Latitude",
+ "positionLongitude": "Longitude",
+ "positionAltitude": "Altitude",
+ "positionSpeed": "Vitesse",
+ "positionCourse": "Orientation",
+ "positionAddress": "Adresse",
+ "positionProtocol": "Protocole",
+ "positionDistance": "Distance",
+ "positionRpm": "t/m",
+ "positionFuel": "Carburant",
+ "positionPower": "Courant",
+ "positionBattery": "Batterie",
+ "positionRaw": "Brut",
+ "positionIndex": "Index",
+ "positionHdop": "Dilution de précision horizontale",
+ "positionVdop": "Dilution de précision verticale",
+ "positionPdop": "Dilution de précision de position",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Satellites visibles",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Itinérance",
+ "positionEvent": "Évènement",
+ "positionAlarm": "Alarme",
+ "positionStatus": "Statut",
+ "positionOdometer": "Odomètre",
+ "positionServiceOdometer": "Odomètre d'entretien",
+ "positionTripOdometer": "Odomètre de voyage",
+ "positionHours": "Heures",
+ "positionSteps": "Etapes",
+ "positionInput": "Entrée de données",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Sortie de données",
+ "positionBatteryLevel": "Niveau de batterie",
+ "positionFuelConsumption": "Consommation de carburant",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Version du micrologiciel",
+ "positionVersionHw": "Version du matériel",
+ "positionIgnition": "Allumage",
+ "positionFlags": "Drapeau",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "Numéro de chassis",
+ "positionApproximate": "Approximatif",
+ "positionThrottle": "Accélérateur",
+ "positionMotion": "Mouvement",
+ "positionArmed": "Armé",
+ "positionAcceleration": "Accélération",
+ "positionTemp": "Température",
+ "positionDeviceTemp": "Température de l'appareil",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Opérateur",
+ "positionCommand": "Commande",
+ "positionBlocked": "Bloqué",
+ "positionDtcs": "Code erreur",
+ "positionObdSpeed": "Vitesse OBD",
+ "positionObdOdometer": "Odomètre OBD",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "ID unique du pilote",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Vidéo",
+ "positionAudio": "Audio",
+ "serverTitle": "Paramètres de serveur",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Inscription",
+ "serverReadonly": "Lecture seule",
+ "serverForceSettings": "Forcer les paramètres",
+ "serverAnnouncement": "Avis",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Carte",
+ "mapActive": "Cartes actives",
+ "mapOverlay": "Superposition de cartes",
+ "mapOverlayCustom": "Superposition personnalisée",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather Clé d'API",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Précipitations",
+ "mapOpenWeatherPressure": "OpenWeather Pression",
+ "mapOpenWeatherWind": "OpenWeather Vents",
+ "mapOpenWeatherTemperature": "OpenWeather Températures",
+ "mapLayer": "Couche cartographique",
+ "mapCustom": "Personnalisé (XYZ)",
+ "mapCustomArcgis": "Personnalisé (ArcGIS)",
+ "mapCustomLabel": "Carte Personnalisée",
+ "mapCarto": "Cartographie Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Clé d'API",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybride",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satelitte",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Jeton d'Accès",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler Clé d'API",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Jeton d'Accès",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom Clé d'API",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here Clé d'API",
+ "mapShapePolygon": "Polygone",
+ "mapShapeCircle": "Cercle",
+ "mapShapePolyline": "Polyligne",
+ "mapLiveRoutes": "Routes en direct",
+ "mapDirection": "Montre la direction",
+ "mapCurrentLocation": "Localisation actuelle",
+ "mapPoiLayer": "Couche Point d'intérêt",
+ "mapClustering": "Regroupement des marqueurs",
+ "mapOnSelect": "Afficher la carte lors de la sélection",
+ "mapDefault": "Carte par défaut",
+ "stateTitle": "État",
+ "stateName": "Paramètre",
+ "stateValue": "Valeur",
+ "commandTitle": "Commande",
+ "commandSend": "Envoyer",
+ "commandSent": "Commande envoyée",
+ "commandQueued": "Commande mise en queue",
+ "commandUnit": "Unité",
+ "commandCustom": "Commande personnalisée",
+ "commandDeviceIdentification": "Identification de l'appareil",
+ "commandPositionSingle": "Rapport de position unique",
+ "commandPositionPeriodic": "Périodicité du rapport de position",
+ "commandPositionStop": "Arrêt du rapport de position",
+ "commandEngineStop": "Arrêt moteur",
+ "commandEngineResume": "Démarrage moteur",
+ "commandAlarmArm": "Activer l'alarme",
+ "commandAlarmDisarm": "Désactiver l'alarme",
+ "commandAlarmDismiss": "Ignorer l'alarme",
+ "commandSetTimezone": "Régler le fuseau horaire",
+ "commandRequestPhoto": "Demander une photo",
+ "commandPowerOff": "Eteindre l'appareil",
+ "commandRebootDevice": "Redémarrer l'appareil",
+ "commandFactoryReset": "Réinitialisation d'usine",
+ "commandSendSms": "Envoyer un SMS",
+ "commandSendUssd": "Envoyer un USSD",
+ "commandSosNumber": "Régler le n° SOS",
+ "commandSilenceTime": "Définir le temps de silence",
+ "commandSetPhonebook": "Définir l'annuaire",
+ "commandVoiceMessage": "Message vocal",
+ "commandOutputControl": "Contrôle de la sortie",
+ "commandVoiceMonitoring": "Moniteur vocal",
+ "commandSetAgps": "Fixer l'AGPS",
+ "commandSetIndicator": "Définir l'indicateur",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Acquérir la version",
+ "commandFirmwareUpdate": "Mettre à jour le firmware",
+ "commandSetConnection": "Fixer la connexion",
+ "commandSetOdometer": "Fixer l'odomètre",
+ "commandGetModemStatus": "Acquérir le statut du modem",
+ "commandGetDeviceStatus": "Acquérir le statut du périphérique",
+ "commandSetSpeedLimit": "Définir la limite de vitesse",
+ "commandModePowerSaving": "Mode économie d'énergie",
+ "commandModeDeepSleep": "Mode veille profonde",
+ "commandAlarmGeofence": "Définir l'alarme périmètre virtuel",
+ "commandAlarmBattery": "Définir l'alarme de batterie",
+ "commandAlarmSos": "Définir l'alarme SOS",
+ "commandAlarmRemove": "Définir l'effacement des alarmes",
+ "commandAlarmClock": "Définir l'alarme de l'horloge",
+ "commandAlarmSpeed": "Définir l'alarme de vitesse",
+ "commandAlarmFall": "Définir l'alarme de chute",
+ "commandAlarmVibration": "Définir l'alarme de vibration",
+ "commandFrequency": "Fréquence",
+ "commandTimezone": "Décalage horaire",
+ "commandMessage": "Message",
+ "commandRadius": "Rayon",
+ "commandEnable": "Activer",
+ "commandData": "Données",
+ "commandIndex": "Index",
+ "commandPhone": "Numéro de téléphone",
+ "commandServer": "Serveur",
+ "commandPort": "Port",
+ "eventAll": "Tous les événements",
+ "eventDeviceOnline": "Statut: en ligne",
+ "eventDeviceUnknown": "Statut: inconnu",
+ "eventDeviceOffline": "Statut: hors ligne",
+ "eventDeviceInactive": "Appareil inactif",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Appareil en mouvement",
+ "eventDeviceStopped": "Appareil arrêté",
+ "eventDeviceOverspeed": "Vitesse limite dépassée",
+ "eventDeviceFuelDrop": "Perte de carburant",
+ "eventDeviceFuelIncrease": "Ajout de carburant",
+ "eventCommandResult": "Résultat de la commande",
+ "eventGeofenceEnter": "Entrée dans le périmètre virtuel",
+ "eventGeofenceExit": "Sortie du périmètre virtuel",
+ "eventAlarm": "Alarme",
+ "eventIgnitionOn": "Contact mis",
+ "eventIgnitionOff": "Contact coupé",
+ "eventMaintenance": "Entretien requis",
+ "eventTextMessage": "Message textuel reçu",
+ "eventDriverChanged": "Changement de conducteur",
+ "eventMedia": "Média",
+ "eventsScrollToLast": "Faire défiler jusqu'à la fin",
+ "eventsSoundEvents": "Son d'événements",
+ "eventsSoundAlarms": "Son d'alarmes",
+ "alarmGeneral": "Général",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Mouvement",
+ "alarmLowspeed": "Basse vitesse",
+ "alarmOverspeed": "Vitesse trop haute",
+ "alarmFallDown": "Chute",
+ "alarmLowPower": "Tension basse",
+ "alarmLowBattery": "Batterie basse",
+ "alarmFault": "Défaut",
+ "alarmPowerOff": "Eteindre",
+ "alarmPowerOn": "Allumer",
+ "alarmDoor": "Porte",
+ "alarmLock": "Verrouiller",
+ "alarmUnlock": "Déverrouiller",
+ "alarmGeofence": "Périmètre virtuel",
+ "alarmGeofenceEnter": "Entrée dans le périmètre virtuel",
+ "alarmGeofenceExit": "Sortie du périmètre virtuel",
+ "alarmGpsAntennaCut": "Antenne GPS coupée",
+ "alarmAccident": "Accident",
+ "alarmTow": "Remorquage",
+ "alarmIdle": "Au repos",
+ "alarmHighRpm": "Tours par minute élevés",
+ "alarmHardAcceleration": "Accélération brusque",
+ "alarmHardBraking": "Freinage brusque",
+ "alarmHardCornering": "Virage sec",
+ "alarmLaneChange": "Changement de bande",
+ "alarmFatigueDriving": "Conduite en état de fatigue",
+ "alarmPowerCut": "Courant coupé",
+ "alarmPowerRestored": "Courant restauré",
+ "alarmJamming": "Brouillage",
+ "alarmTemperature": "Température",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Capot",
+ "alarmFootBrake": "Frein à pied",
+ "alarmFuelLeak": "Fuite de carburant",
+ "alarmTampering": "Altération",
+ "alarmRemoving": "Retrait",
+ "notificationType": "Type de notification",
+ "notificationAlways": "Tous les appareils",
+ "notificationNotificators": "Canaux",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combinés",
+ "reportRoute": "Route",
+ "reportEvents": "Évènements",
+ "reportTrips": "Trajets",
+ "reportStops": "Arrêts",
+ "reportSummary": "Résumé",
+ "reportDaily": "Rapport journalier",
+ "reportChart": "Graphique",
+ "reportConfigure": "Configurer",
+ "reportEventTypes": "Types d'évènements",
+ "reportChartType": "Type de graphique",
+ "reportShowMarkers": "Montrer les marqueurs",
+ "reportExport": "Exporter",
+ "reportEmail": "Rapport par email",
+ "reportSchedule": "Programme",
+ "reportPeriod": "Période",
+ "reportCustom": "Personnalisé",
+ "reportToday": "Aujourd'hui",
+ "reportYesterday": "Hier",
+ "reportThisWeek": "Cette semaine",
+ "reportPreviousWeek": "La semaine dernière",
+ "reportThisMonth": "Ce mois-ci",
+ "reportPreviousMonth": "Le mois dernier",
+ "reportDeviceName": "Nom de l'appareil",
+ "reportAverageSpeed": "Vitesse moyenne",
+ "reportMaximumSpeed": "Vitesse maximum",
+ "reportEngineHours": "Heures du moteur",
+ "reportDuration": "Durée",
+ "reportStartDate": "Date de départ",
+ "reportStartTime": "Heure de départ",
+ "reportStartAddress": "Adresse de départ",
+ "reportEndTime": "Date de fin",
+ "reportEndAddress": "Adresse de fin",
+ "reportSpentFuel": "Consommation de carburant",
+ "reportStartOdometer": "Départ de l'odomètre",
+ "reportEndOdometer": "Arrêt de l'odomètre",
+ "statisticsTitle": "Statistiques",
+ "statisticsCaptureTime": "Heure de capture",
+ "statisticsActiveUsers": "Utilisateurs actifs",
+ "statisticsActiveDevices": "Appareils actifs",
+ "statisticsRequests": "Requêtes",
+ "statisticsMessagesReceived": "Messages reçus",
+ "statisticsMessagesStored": "Messages stockés",
+ "statisticsGeocoder": "Requêtes de géocodage",
+ "statisticsGeolocation": "Requêtes de géolocalisation",
+ "categoryArrow": "Flèche",
+ "categoryDefault": "Par défaut",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Vélo",
+ "categoryBoat": "Bateau",
+ "categoryBus": "Bus",
+ "categoryCar": "Voiture",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Grue",
+ "categoryHelicopter": "Hélicoptère",
+ "categoryMotorcycle": "Moto",
+ "categoryOffroad": "Véhicule tout-terrain",
+ "categoryPerson": "Personne",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Avion",
+ "categoryShip": "Bateau",
+ "categoryTractor": "Tracteur",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Camion",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Départ",
+ "maintenancePeriod": "Période"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/gl.json b/legacy/web/l10n/gl.json
new file mode 100644
index 00000000..8464e7bb
--- /dev/null
+++ b/legacy/web/l10n/gl.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Cargando...",
+ "sharedHide": "Agochar",
+ "sharedSave": "Gardar",
+ "sharedUpload": "Upload",
+ "sharedSet": "Establecer",
+ "sharedCancel": "Cancelar",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Engadir",
+ "sharedEdit": "Editar",
+ "sharedRemove": "Eliminar",
+ "sharedRemoveConfirm": "Eliminar elemento?",
+ "sharedNoData": "Sen datos",
+ "sharedSubject": "Subject",
+ "sharedYes": "Si",
+ "sharedNo": "Non",
+ "sharedKm": "Km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "Nós",
+ "sharedKmh": "Km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Hora",
+ "sharedMinute": "Minuto",
+ "sharedSecond": "Segundo",
+ "sharedDays": "días",
+ "sharedHours": "horas",
+ "sharedMinutes": "minutos",
+ "sharedDecimalDegrees": "Graos",
+ "sharedDegreesDecimalMinutes": "Minutos",
+ "sharedDegreesMinutesSeconds": "Segundos",
+ "sharedName": "Nome",
+ "sharedDescription": "Descrición",
+ "sharedSearch": "Buscar",
+ "sharedIconScale": "Escala das iconas",
+ "sharedGeofence": "Xeocerca",
+ "sharedGeofences": "Xeocercas",
+ "sharedCreateGeofence": "Crear xeocerca",
+ "sharedNotifications": "Notificacións",
+ "sharedNotification": "Notificación",
+ "sharedAttributes": "Atributos",
+ "sharedAttribute": "Atributo",
+ "sharedDrivers": "Condutores",
+ "sharedDriver": "Condutor",
+ "sharedArea": "Área",
+ "sharedSound": "Son de notificación",
+ "sharedType": "Tipo",
+ "sharedDistance": "Distancia",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Litro",
+ "sharedImpGallon": "Imp. Galón",
+ "sharedUsGallon": "Galón dos EUA",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Obter o estado do mapa",
+ "sharedComputedAttribute": "Atributo calculado",
+ "sharedComputedAttributes": "Atributos calculados",
+ "sharedCheckComputedAttribute": "Revisar atributo calculado",
+ "sharedExpression": "Expresión",
+ "sharedDevice": "Dispositivo",
+ "sharedTest": "Probar",
+ "sharedTestNotification": "Enviar notificación de proba",
+ "sharedTestNotificators": "Probar Canles",
+ "sharedTestExpression": "Probar expresión",
+ "sharedCalendar": "Calendario",
+ "sharedCalendars": "Calendarios",
+ "sharedFile": "Arquivo",
+ "sharedSearchDevices": "Buscar dispositivos",
+ "sharedSortBy": "Ordenar por",
+ "sharedFilterMap": "Filtrar no mapa",
+ "sharedSelectFile": "Seleccione Arquivo",
+ "sharedPhone": "Teléfono",
+ "sharedRequired": "Obrigatorio",
+ "sharedPreferences": "Preferencias",
+ "sharedPermissions": "Permisos",
+ "sharedConnections": "Conexións",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Principal",
+ "sharedSecondary": "Secundario",
+ "sharedTypeString": "Cadena",
+ "sharedTypeNumber": "Número",
+ "sharedTypeBoolean": "Booleano",
+ "sharedTimezone": "Fuso horario",
+ "sharedInfoTitle": "Información",
+ "sharedSavedCommand": "Comando gardado",
+ "sharedSavedCommands": "Comandos gardados",
+ "sharedNew": "Novo…",
+ "sharedShowAddress": "Mostrar enderezo",
+ "sharedShowDetails": "Máis detalles",
+ "sharedDisabled": "Desactivado",
+ "sharedMaintenance": "Mantemento",
+ "sharedDeviceAccumulators": "Acumuladores",
+ "sharedAlarms": "Alarmas",
+ "sharedLocation": "Localización",
+ "sharedImport": "Importar",
+ "sharedColumns": "Columnas",
+ "sharedDropzoneText": "Arrastra e solta un arquivo aquí ou fai clic",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recorrencia",
+ "calendarOnce": "Unha vez",
+ "calendarDaily": "A diario",
+ "calendarWeekly": "Semanal",
+ "calendarMonthly": "Mensual",
+ "calendarDays": "Días",
+ "calendarSunday": "Domingo",
+ "calendarMonday": "Luns",
+ "calendarTuesday": "martes",
+ "calendarWednesday": "Mércores",
+ "calendarThursday": "Xoves",
+ "calendarFriday": "Venres",
+ "calendarSaturday": "Sábado",
+ "attributeShowGeofences": "Mostrar xeocercas",
+ "attributeSpeedLimit": "Límite de velocidade",
+ "attributeFuelDropThreshold": "Limiar de perda de combustible",
+ "attributeFuelIncreaseThreshold": "Umbral de subida de combustible",
+ "attributePolylineDistance": "Distancia de poliliña",
+ "attributeReportIgnoreOdometer": "Informe: ignorar o odómetro",
+ "attributeWebReportColor": "Web: Cor de informe",
+ "attributeDevicePassword": "Contrasinal do dispositivo",
+ "attributeDeviceImage": "Imaxe do dispositivo",
+ "attributeDeviceInactivityStart": "Inicio da inactividade do dispositivo",
+ "attributeDeviceInactivityPeriod": "Período de inactividade do dispositivo",
+ "attributeProcessingCopyAttributes": "Procesamento: Copia de atributos",
+ "attributeColor": "Cor",
+ "attributeWebLiveRouteLength": "Web: Lonxitude da ruta en directo",
+ "attributeWebSelectZoom": "Web: Zoom na selección",
+ "attributeWebMaxZoom": "Web: Zoom máximo",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover nomes de dispositivos",
+ "attributeMailSmtpHost": "Correo: Servidor SMTP",
+ "attributeMailSmtpPort": "Correo: porto SMTP",
+ "attributeMailSmtpStarttlsEnable": "Correo: Activar SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "Correo: SMTP STARTTLS necesario",
+ "attributeMailSmtpSslEnable": "Correo: Activar SMTP SSL",
+ "attributeMailSmtpSslTrust": "Correo: SMTP SSL de confianza",
+ "attributeMailSmtpSslProtocols": "Correo: Protocolos SMTP SSL",
+ "attributeMailSmtpFrom": "Correo: SMTP De",
+ "attributeMailSmtpAuth": "Correo: Activar autenticación SMTP",
+ "attributeMailSmtpUsername": "Correo: Nome de usuario SMTP",
+ "attributeMailSmtpPassword": "Correo: Contrasinal SMTP",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "IU: Desactivar atributos",
+ "attributeUiDisableGroups": "IU: Desactivar grupos",
+ "attributeUiDisableEvents": "IU: Desactivar eventos",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "IU: Desactivar condutores",
+ "attributeUiDisableComputedAttributes": "IU: Desactivar atributos calculados",
+ "attributeUiDisableCalendars": "IU: desactivar os calendarios",
+ "attributeUiDisableMaintenance": "IU: Desactivar o mantemento",
+ "attributeUiHidePositionAttributes": "IU: ocultar atributos de posición",
+ "attributeUiDisableLoginLanguage": "IU: desactivar o idioma de inicio de sesión",
+ "attributeNotificationTokens": "Tokens de notificación",
+ "attributePopupInfo": "Información emerxente",
+ "errorTitle": "Erro",
+ "errorGeneral": "Parámetros non válidos ou violación das restricións",
+ "errorConnection": "Erro de conexión",
+ "errorSocket": "Erro de conexión do socket web",
+ "errorZero": "Non pode ser cero",
+ "userEmail": "Email",
+ "userPassword": "Contrasinal",
+ "userAdmin": "Administrador",
+ "userRemember": "Recordar",
+ "userExpirationTime": "Caducidade",
+ "userDeviceLimit": "Límite de dispositivos",
+ "userUserLimit": "Límite de usuarios",
+ "userDeviceReadonly": "Dispositivo só de lectura",
+ "userLimitCommands": "Limitar comandos",
+ "userDisableReports": "Desactivar informes",
+ "userFixedEmail": "Sen cambio de correo electrónico",
+ "userToken": "Token Acceso",
+ "userDeleteAccount": "Eliminar conta",
+ "userTemporary": "Temporary",
+ "loginTitle": "Iniciar sesión",
+ "loginLanguage": "Idioma",
+ "loginReset": "Restablecer o contrasinal",
+ "loginRegister": "Rexistrarse",
+ "loginLogin": "Iniciar sesión",
+ "loginOpenId": "Iniciar sesión con OpenID",
+ "loginFailed": "Enderezo de correo electrónico ou contrasinal incorrectos",
+ "loginCreated": "Rexistrouse un novo usuario",
+ "loginResetSuccess": "Comprobe o seu correo electrónico",
+ "loginUpdateSuccess": "Establécese un novo contrasinal",
+ "loginLogout": "Pechar sesión",
+ "loginLogo": "Logotipo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Dispositivos e estado",
+ "deviceSelected": "Dispositivo seleccionado",
+ "deviceTitle": "Dispositivos",
+ "devicePrimaryInfo": "Título do dispositivo",
+ "deviceSecondaryInfo": "Detalle do dispositivo",
+ "deviceIdentifier": "Identificador",
+ "deviceModel": "Modelo",
+ "deviceContact": "Contacto",
+ "deviceCategory": "Categoría",
+ "deviceLastUpdate": "Última actualización",
+ "deviceCommand": "Comando",
+ "deviceFollow": "Seguir",
+ "deviceTotalDistance": "Distancia total",
+ "deviceStatus": "Estado",
+ "deviceStatusOnline": "En liña",
+ "deviceStatusOffline": "Sen conexión",
+ "deviceStatusUnknown": "Descoñecido",
+ "deviceRegisterFirst": "Rexistra o teu primeiro dispositivo",
+ "deviceIdentifierHelp": " O IMEI, número de serie ou outro id., ten que ser igual que o identificador do dispositivo que se meteu no servidor",
+ "deviceShare": "Share Device",
+ "groupDialog": "Grupo",
+ "groupParent": "Grupo",
+ "groupNoGroup": "Sen grupo",
+ "settingsTitle": "Axustes",
+ "settingsUser": "Conta",
+ "settingsGroups": "Grupos",
+ "settingsServer": "Servidor",
+ "settingsUsers": "Usuarios",
+ "settingsDistanceUnit": "Unidade de Distancia",
+ "settingsAltitudeUnit": "Unidade de altitude",
+ "settingsSpeedUnit": "Unidade de velocidade",
+ "settingsVolumeUnit": "Unidad de volumen",
+ "settingsTwelveHourFormat": "Formato de 12 horas",
+ "settingsCoordinateFormat": "Formato de coordenadas",
+ "settingsServerVersion": "Versión do servidor",
+ "settingsAppVersion": "Versión da aplicación",
+ "settingsConnection": "Conexión",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Informes",
+ "reportScheduled": "Informes programados",
+ "reportDevice": "Dispositivo",
+ "reportGroup": "Grupo",
+ "reportFrom": "Dende",
+ "reportTo": "Ata",
+ "reportShow": "Mostrar",
+ "reportClear": "Limpar",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Hora axustada",
+ "positionDeviceTime": "Hora do dispositivo",
+ "positionServerTime": "Hora do servidor",
+ "positionValid": "Válida",
+ "positionAccuracy": "Precisión",
+ "positionLatitude": "Latitude",
+ "positionLongitude": "Lonxitude",
+ "positionAltitude": "Altitude",
+ "positionSpeed": "Velocidade",
+ "positionCourse": "Rumbo",
+ "positionAddress": "Enderezo",
+ "positionProtocol": "Protocolo",
+ "positionDistance": "Distancia",
+ "positionRpm": "RPM",
+ "positionFuel": "Combustible",
+ "positionPower": "Enerxía",
+ "positionBattery": "Batería",
+ "positionRaw": "Crudo",
+ "positionIndex": "Índice",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satélites",
+ "positionSatVisible": "Satélites visibles",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Itinerancia",
+ "positionEvent": "Evento",
+ "positionAlarm": "Alarma",
+ "positionStatus": "Estado",
+ "positionOdometer": "Odómetro",
+ "positionServiceOdometer": "Odómetro de mantemento",
+ "positionTripOdometer": "Odómetro de viaxe",
+ "positionHours": "Horas",
+ "positionSteps": "Pasos",
+ "positionInput": "Entrada",
+ "positionHeartRate": "Ritmo cardíaco",
+ "positionOutput": "Saída",
+ "positionBatteryLevel": "Nivel de batería",
+ "positionFuelConsumption": "Consumo de combustible",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Versión de firmware",
+ "positionVersionHw": "Versión de hardware",
+ "positionIgnition": "Encendido",
+ "positionFlags": "Bandeiras",
+ "positionCharge": "Carga",
+ "positionIp": "IP",
+ "positionArchive": "Arquivo",
+ "positionVin": "VIN",
+ "positionApproximate": "Aproximado",
+ "positionThrottle": "Acelerador",
+ "positionMotion": "Movemento",
+ "positionArmed": "Armado",
+ "positionAcceleration": "Aceleración",
+ "positionTemp": "Temperatura",
+ "positionDeviceTemp": "Temperatura do dispositivo",
+ "positionCoolantTemp": "Temperatura do Refrixerante",
+ "positionOperator": "Operador",
+ "positionCommand": "Comando",
+ "positionBlocked": "Bloqueado",
+ "positionDtcs": "DTC",
+ "positionObdSpeed": "Velocidade OBD",
+ "positionObdOdometer": "Odómetro OBD",
+ "positionDrivingTime": "Tempo conducindo",
+ "positionDriverUniqueId": "ID única do condutor",
+ "positionCard": "Tarxeta",
+ "positionImage": "Imaxe",
+ "positionVideo": "Vídeo",
+ "positionAudio": "Audio",
+ "serverTitle": "Axustes do servidor",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Rexistro",
+ "serverReadonly": "Só lectura",
+ "serverForceSettings": "Forzar axustes",
+ "serverAnnouncement": "Anuncio",
+ "serverName": "Nome do servidor",
+ "serverDescription": "Descrición do servidor",
+ "serverColorPrimary": "Color primario",
+ "serverColorSecondary": "Color secundario",
+ "serverLogo": "Imaxe do logotipo",
+ "serverLogoInverted": "Imaxe do logotipo con cores inversos",
+ "serverChangeDisable": "Desactivar o cambio de servidor",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Mapa",
+ "mapActive": "Mapas activos",
+ "mapOverlay": "Superposición de mapas",
+ "mapOverlayCustom": "Superposición personalizada",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Capa do mapa",
+ "mapCustom": "Personalizado (XYZ)",
+ "mapCustomArcgis": "Personalizado (ArcGIS)",
+ "mapCustomLabel": "Mapa personalizado",
+ "mapCarto": "Carto",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps - Clave",
+ "mapBingRoad": "Bing Maps - Carreteras",
+ "mapBingAerial": "Bing Maps - Aéreo",
+ "mapBingHybrid": "Bing Maps - Híbrido",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex",
+ "mapYandexSat": "Yandex Satélite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polígono",
+ "mapShapeCircle": "Círculo",
+ "mapShapePolyline": "Poliliña",
+ "mapLiveRoutes": "Rutas en directo",
+ "mapDirection": "Mostrar dirección",
+ "mapCurrentLocation": "Localización actual",
+ "mapPoiLayer": "Capa de PDI",
+ "mapClustering": "Agrupar marcadores",
+ "mapOnSelect": "Mostrar mapa na selección",
+ "mapDefault": "Mapa por defecto",
+ "stateTitle": "Estado",
+ "stateName": "Atributo",
+ "stateValue": "Valor",
+ "commandTitle": "Comando",
+ "commandSend": "Enviar",
+ "commandSent": "Comando enviado",
+ "commandQueued": "Comando en cola",
+ "commandUnit": "Unidade",
+ "commandCustom": "Comando personalizado",
+ "commandDeviceIdentification": "Identificador do dispositivo",
+ "commandPositionSingle": "Informe único",
+ "commandPositionPeriodic": "Informes periódicos",
+ "commandPositionStop": "Deixar de informar",
+ "commandEngineStop": "Apagar motor",
+ "commandEngineResume": "Desbloquear aceso de motor",
+ "commandAlarmArm": "Armar alarma",
+ "commandAlarmDisarm": "Desarmar alarma",
+ "commandAlarmDismiss": "Descartar alarma",
+ "commandSetTimezone": "Establecer fuso horario",
+ "commandRequestPhoto": "Solicitar foto",
+ "commandPowerOff": "Apagar o dispositivo",
+ "commandRebootDevice": "Reiniciar dispositivo",
+ "commandFactoryReset": "Restablecemento de fábrica",
+ "commandSendSms": "Enviar SMS",
+ "commandSendUssd": "Enviar USSD",
+ "commandSosNumber": "Establece o número de SOS",
+ "commandSilenceTime": "Establecer o horario de silencio",
+ "commandSetPhonebook": "Establecer axenda telefónica",
+ "commandVoiceMessage": "Mensaxe de voz",
+ "commandOutputControl": "Control de saídas",
+ "commandVoiceMonitoring": "Monitorización de voz",
+ "commandSetAgps": "Establecer AGPS",
+ "commandSetIndicator": "Establecer indicador",
+ "commandConfiguration": "Configuración",
+ "commandGetVersion": "Obter a versión",
+ "commandFirmwareUpdate": "Actualizar o firmware",
+ "commandSetConnection": "Establecer conexión",
+ "commandSetOdometer": "Establecer odómetro",
+ "commandGetModemStatus": "Obter o estado do módem",
+ "commandGetDeviceStatus": "Obter o estado do dispositivo",
+ "commandSetSpeedLimit": "Establecer límite de velocidade",
+ "commandModePowerSaving": "Modo de aforro de enerxía",
+ "commandModeDeepSleep": "Modo de aforro de enerxía profundo",
+ "commandAlarmGeofence": "Establecer alarma de xeocerca",
+ "commandAlarmBattery": "Establecer alarma de batería",
+ "commandAlarmSos": "Establecer alarma de SOS",
+ "commandAlarmRemove": "Establecer alarma de desmontaje",
+ "commandAlarmClock": "Establecer alarma de hora",
+ "commandAlarmSpeed": "Establecer alarma de velocidade",
+ "commandAlarmFall": "Establecer alarma de caída",
+ "commandAlarmVibration": "Establecer alarma de vibración",
+ "commandFrequency": "Frecuencia",
+ "commandTimezone": "Desfase de fuso horario",
+ "commandMessage": "Mensaxe",
+ "commandRadius": "Radio",
+ "commandEnable": "Activar",
+ "commandData": "Datos",
+ "commandIndex": "Índice",
+ "commandPhone": "Número de teléfono",
+ "commandServer": "Servidor",
+ "commandPort": "Porto",
+ "eventAll": "Todos os eventos",
+ "eventDeviceOnline": "Estado en liña",
+ "eventDeviceUnknown": "Estado descoñecido",
+ "eventDeviceOffline": "Estado sen conexión",
+ "eventDeviceInactive": "Dispositivo inactivo",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Dispositivo en movemento",
+ "eventDeviceStopped": "Dispositivo detido",
+ "eventDeviceOverspeed": "Superouse o límite de velocidade",
+ "eventDeviceFuelDrop": "Perda de combustible",
+ "eventDeviceFuelIncrease": "Aumento de combustible",
+ "eventCommandResult": "Resultado do comando",
+ "eventGeofenceEnter": "Entrada na xeocerca",
+ "eventGeofenceExit": "Saída da cerca xeocerca",
+ "eventAlarm": "Alarma",
+ "eventIgnitionOn": "Chave Encendida - ON",
+ "eventIgnitionOff": "Chave apagada - OFF",
+ "eventMaintenance": "Necesítase mantemento",
+ "eventTextMessage": "Mensaxe de texto recibida",
+ "eventDriverChanged": "O condutor cambiou",
+ "eventMedia": "Medios",
+ "eventsScrollToLast": "Desprazarse ata o último",
+ "eventsSoundEvents": "Sonido para eventos",
+ "eventsSoundAlarms": "Sonido para alarmas",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibración",
+ "alarmMovement": "Movemento",
+ "alarmLowspeed": "Baixa velocidade",
+ "alarmOverspeed": "Exceso de velocidade",
+ "alarmFallDown": "Alarma de caída",
+ "alarmLowPower": "Enerxía baixa",
+ "alarmLowBattery": "Batería baixa",
+ "alarmFault": "Alarma de fallo",
+ "alarmPowerOff": "Apagado",
+ "alarmPowerOn": "Encendido",
+ "alarmDoor": "Porta",
+ "alarmLock": "Bloquear",
+ "alarmUnlock": "Desbloquear",
+ "alarmGeofence": "Xeocerca",
+ "alarmGeofenceEnter": "Entrou na xeocerca",
+ "alarmGeofenceExit": "Saíu da xeocerca",
+ "alarmGpsAntennaCut": "Corte de antena GPS",
+ "alarmAccident": "Accidente",
+ "alarmTow": "Guindastre de arrastre",
+ "alarmIdle": "Inactivo",
+ "alarmHighRpm": "Altas RPM",
+ "alarmHardAcceleration": "Aceleración brusca",
+ "alarmHardBraking": "Freada brusca",
+ "alarmHardCornering": "Xiro brusco",
+ "alarmLaneChange": "Cambio de carril",
+ "alarmFatigueDriving": "Condución con cansazo",
+ "alarmPowerCut": "Corte de alimentación",
+ "alarmPowerRestored": "Enerxía restablecida",
+ "alarmJamming": "Interferencia",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Aparcadoiro",
+ "alarmBonnet": "Capó",
+ "alarmFootBrake": "Freo de pé",
+ "alarmFuelLeak": "Fuga de combustible",
+ "alarmTampering": "Manipulación",
+ "alarmRemoving": "Eliminando",
+ "notificationType": "Tipo de notificación",
+ "notificationAlways": "Todos os dispositivos",
+ "notificationNotificators": "Canles",
+ "notificatorCommand": "Comando",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Correo",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Repetición ruta",
+ "reportCombined": "Combinado \n ",
+ "reportRoute": "Ruta",
+ "reportEvents": "Eventos",
+ "reportTrips": "Viaxes",
+ "reportStops": "Paradas",
+ "reportSummary": "Resumo",
+ "reportDaily": "Resumo diario",
+ "reportChart": "Gráfica",
+ "reportConfigure": "Configurar",
+ "reportEventTypes": "Tipos de eventos",
+ "reportChartType": "Tipo de gráfica",
+ "reportShowMarkers": "Amosar marcadores",
+ "reportExport": "Exportar",
+ "reportEmail": "Informe por correo",
+ "reportSchedule": "Planificación",
+ "reportPeriod": "Período",
+ "reportCustom": "Personalizado",
+ "reportToday": "Hoxe",
+ "reportYesterday": "Onte",
+ "reportThisWeek": "Esta semana",
+ "reportPreviousWeek": "Semana anterior",
+ "reportThisMonth": "Este mes",
+ "reportPreviousMonth": "Mes anterior",
+ "reportDeviceName": "Nome",
+ "reportAverageSpeed": "Velocidade media",
+ "reportMaximumSpeed": "Velocidade máxima",
+ "reportEngineHours": "Horas do motor",
+ "reportDuration": "Duración",
+ "reportStartDate": "Data de inicio",
+ "reportStartTime": "Hora de inicio",
+ "reportStartAddress": "Enderezo de inicio",
+ "reportEndTime": "Hora de fin",
+ "reportEndAddress": "Enderezo de fin",
+ "reportSpentFuel": "Combustible gastado",
+ "reportStartOdometer": "Odómetro inicial",
+ "reportEndOdometer": "Odómetro final",
+ "statisticsTitle": "Estatísticas",
+ "statisticsCaptureTime": "Fecha de captura",
+ "statisticsActiveUsers": "Usuarios activos",
+ "statisticsActiveDevices": "Dispositivos activos",
+ "statisticsRequests": "Peticións",
+ "statisticsMessagesReceived": "Mensaxes recibidas",
+ "statisticsMessagesStored": "Mensaxes almacenadas",
+ "statisticsGeocoder": "Solicitudes ao xeocodificador",
+ "statisticsGeolocation": "Solicitudes de xeolocalización",
+ "categoryArrow": "Frecha",
+ "categoryDefault": "Por defecto",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicicleta",
+ "categoryBoat": "Barco",
+ "categoryBus": "Autobús",
+ "categoryCar": "Coche",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Grúa",
+ "categoryHelicopter": "Helicóptero",
+ "categoryMotorcycle": "Motocicleta",
+ "categoryOffroad": "Todoterreo",
+ "categoryPerson": "Persoa",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Avión",
+ "categoryShip": "Barco",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Tren",
+ "categoryTram": "Tranvía",
+ "categoryTrolleybus": "Trolebús",
+ "categoryTruck": "Camión",
+ "categoryVan": "Furgoneta",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Comezar",
+ "maintenancePeriod": "Período"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/he.json b/legacy/web/l10n/he.json
new file mode 100644
index 00000000..8a2a4eed
--- /dev/null
+++ b/legacy/web/l10n/he.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "טוען...",
+ "sharedHide": "הסתר",
+ "sharedSave": "שמירה",
+ "sharedUpload": "Upload",
+ "sharedSet": "הגדרה",
+ "sharedCancel": "ביטול",
+ "sharedCopy": "העתקה",
+ "sharedAdd": "הוספה",
+ "sharedEdit": "עריכה",
+ "sharedRemove": "הסרה",
+ "sharedRemoveConfirm": "הסרת פריט",
+ "sharedNoData": "No data",
+ "sharedSubject": "נושא",
+ "sharedYes": "כן",
+ "sharedNo": "לא",
+ "sharedKm": "ק\"מ",
+ "sharedMi": "מייל",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "קשר",
+ "sharedKmh": "ק\"מ/שעה",
+ "sharedMph": "מייל/שעה",
+ "sharedHour": "שעה",
+ "sharedMinute": "דקה",
+ "sharedSecond": "שנייה",
+ "sharedDays": "ימים",
+ "sharedHours": "שעות",
+ "sharedMinutes": "דקות",
+ "sharedDecimalDegrees": "מעלות עשרוניות",
+ "sharedDegreesDecimalMinutes": "מעלות ודקות עשרוניות",
+ "sharedDegreesMinutesSeconds": "מעלות, דקות ושניות",
+ "sharedName": "שם",
+ "sharedDescription": "תיאור",
+ "sharedSearch": "חיפוש",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "גדר וירטואלית",
+ "sharedGeofences": "גדרות וירטואליות",
+ "sharedCreateGeofence": "צרו איזור מגודר",
+ "sharedNotifications": "התראות",
+ "sharedNotification": "התראה",
+ "sharedAttributes": "תכונות",
+ "sharedAttribute": "תכונה",
+ "sharedDrivers": "נהגים",
+ "sharedDriver": "נהג",
+ "sharedArea": "איזור",
+ "sharedSound": "צליל התראה",
+ "sharedType": "סוג",
+ "sharedDistance": "מרחק",
+ "sharedHourAbbreviation": "ש'",
+ "sharedMinuteAbbreviation": "דק'",
+ "sharedSecondAbbreviation": "שנ'",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "ל",
+ "sharedGallonAbbreviation": "גלון",
+ "sharedLiter": "ליטר",
+ "sharedImpGallon": "גלון",
+ "sharedUsGallon": "גלון",
+ "sharedLiterPerHourAbbreviation": "ליטר/ שעה",
+ "sharedGetMapState": "הגדר מהמפה",
+ "sharedComputedAttribute": "תכונה ממוחשבת",
+ "sharedComputedAttributes": "תכונה ממוחשבת",
+ "sharedCheckComputedAttribute": "בדוק תכונות ממוחשבות",
+ "sharedExpression": "ביטוי",
+ "sharedDevice": "התקן",
+ "sharedTest": "בדיקה",
+ "sharedTestNotification": "שלח הודעת בדיקה",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "יומן",
+ "sharedCalendars": "יומנים",
+ "sharedFile": "קובץ",
+ "sharedSearchDevices": "חיפוש מכשירים",
+ "sharedSortBy": "מיון לפי",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "בחר קובץ",
+ "sharedPhone": "טלפון",
+ "sharedRequired": "נדרש",
+ "sharedPreferences": "עדיפויות",
+ "sharedPermissions": "הרשאות",
+ "sharedConnections": "Connections",
+ "sharedExtra": "תוספת",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "מחרוזת",
+ "sharedTypeNumber": "מספר",
+ "sharedTypeBoolean": "בוליאני",
+ "sharedTimezone": "אזור זמן",
+ "sharedInfoTitle": "פרטים",
+ "sharedSavedCommand": "פקודות שמורות",
+ "sharedSavedCommands": "פקודות שמורות",
+ "sharedNew": "חדש",
+ "sharedShowAddress": "הצג כתובת",
+ "sharedShowDetails": "יותר פרטים",
+ "sharedDisabled": "מושבת",
+ "sharedMaintenance": "תחזוקה",
+ "sharedDeviceAccumulators": "מצברים",
+ "sharedAlarms": "אזעקות",
+ "sharedLocation": "מיקום",
+ "sharedImport": "ייבוא",
+ "sharedColumns": "עמודות",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "פעם אחת",
+ "calendarDaily": "יומי",
+ "calendarWeekly": "שבועי",
+ "calendarMonthly": "חודשי",
+ "calendarDays": "Days",
+ "calendarSunday": "יום ראשון",
+ "calendarMonday": "יום שני",
+ "calendarTuesday": "יום שלישי",
+ "calendarWednesday": "יום רביעי",
+ "calendarThursday": "יום חמישי",
+ "calendarFriday": "יום שישי",
+ "calendarSaturday": "שבת",
+ "attributeShowGeofences": "הצג איזורים מגודרים",
+ "attributeSpeedLimit": "הגבלת מהירות",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "מרחק מצולע",
+ "attributeReportIgnoreOdometer": "דוח : התעלם ממד המרחק",
+ "attributeWebReportColor": "אתר : בחר צבע",
+ "attributeDevicePassword": "סיסמת התקן ",
+ "attributeDeviceImage": "תמונת רכב",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "עיבוד: העתקת תכונות",
+ "attributeColor": "צבע",
+ "attributeWebLiveRouteLength": "ממשק : אורך מסלול זמן אמת",
+ "attributeWebSelectZoom": "אתר : בחר הפעלת זום",
+ "attributeWebMaxZoom": "אתר : זום מקסימלי",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "כתובת שרת דואר SMTP",
+ "attributeMailSmtpPort": "שרת דואר: פורט גישה ",
+ "attributeMailSmtpStarttlsEnable": "אפשר מייל מאובטח באמצעות TLS",
+ "attributeMailSmtpStarttlsRequired": "נדרש SMTP STARTTLS ",
+ "attributeMailSmtpSslEnable": "אפשר SSL לשרת דואר",
+ "attributeMailSmtpSslTrust": "דואר:SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "פרוטוקול חיבור SSL לשרת דואר",
+ "attributeMailSmtpFrom": "כתובת השולח ",
+ "attributeMailSmtpAuth": "אפשר אימות לSMTP",
+ "attributeMailSmtpUsername": "שם משתמש SMTP ",
+ "attributeMailSmtpPassword": "סיסמת SMTP",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "ממשק: בטל ארועים",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "ממשק : בטל נהגים ",
+ "attributeUiDisableComputedAttributes": "ממשק : בטל תכונה ממוחשבת",
+ "attributeUiDisableCalendars": "ממשק : בטל יומנים",
+ "attributeUiDisableMaintenance": "אל תציג :תחזוקה",
+ "attributeUiHidePositionAttributes": "ממשק : הסתר מיקום תכונות",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "שגיאה",
+ "errorGeneral": "גורם לא בתוקף או הפרת אילוצים ",
+ "errorConnection": "בעייה בחיבור",
+ "errorSocket": "בעיית רשת",
+ "errorZero": "ערך לא יכול להיות אפס",
+ "userEmail": "אימייל",
+ "userPassword": "סיסמה",
+ "userAdmin": "מנהל",
+ "userRemember": "זכור אותי",
+ "userExpirationTime": "תוקף",
+ "userDeviceLimit": "מגבלת מכשירים",
+ "userUserLimit": "מגבלת משתמשים",
+ "userDeviceReadonly": "מכשירים - לקריאה בלבד",
+ "userLimitCommands": "הגבל פקודות ",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "אסימון",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "כניסה",
+ "loginLanguage": "שפה",
+ "loginReset": "איפוס סיסמה",
+ "loginRegister": "הרשם",
+ "loginLogin": "כניסה",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "אימייל או סיסמה שגויים",
+ "loginCreated": "משתמש חדש נרשם",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "הסיסמה החדשה הוגדרה",
+ "loginLogout": "יציאה",
+ "loginLogo": "לוגו",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "מכשירים וסטטוס",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "מכשירים",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "מזהה",
+ "deviceModel": "דגם",
+ "deviceContact": "איש קשר",
+ "deviceCategory": "קטגוריה",
+ "deviceLastUpdate": "עודכן לאחרונה",
+ "deviceCommand": "פקודה",
+ "deviceFollow": "עקוב",
+ "deviceTotalDistance": "מרחק כולל",
+ "deviceStatus": "סטטוס",
+ "deviceStatusOnline": "מחובר",
+ "deviceStatusOffline": "מנותק",
+ "deviceStatusUnknown": "מצבו אינו ידוע",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "קבוצה",
+ "groupParent": "קבוצה",
+ "groupNoGroup": "ללא קבוצה",
+ "settingsTitle": "הגדרות",
+ "settingsUser": "חשבון",
+ "settingsGroups": "קבוצות",
+ "settingsServer": "שרת",
+ "settingsUsers": "משתמשים",
+ "settingsDistanceUnit": "יח מרחק",
+ "settingsAltitudeUnit": "יחידת גובה",
+ "settingsSpeedUnit": "יח מהירות ",
+ "settingsVolumeUnit": "יחידת נפח",
+ "settingsTwelveHourFormat": "פורמט של 12 שעות",
+ "settingsCoordinateFormat": "פורמט קואורדינטות",
+ "settingsServerVersion": "גרסת השרת",
+ "settingsAppVersion": "גרסת האפליקציה",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "דו\"חות",
+ "reportScheduled": "דוחות מתוזמנים",
+ "reportDevice": "מכשיר",
+ "reportGroup": "קבוצה",
+ "reportFrom": "מ-",
+ "reportTo": "עד",
+ "reportShow": "הצג",
+ "reportClear": "נקה",
+ "linkGoogleMaps": "מפות גוגל",
+ "linkAppleMaps": "מפות אפל",
+ "linkStreetView": "תצוגת רחוב",
+ "positionFixTime": "זמן עדכון GPS",
+ "positionDeviceTime": "עדכון אחרון",
+ "positionServerTime": "זמן השרת",
+ "positionValid": "תקין",
+ "positionAccuracy": "דיוק",
+ "positionLatitude": "קו רוחב",
+ "positionLongitude": "קו אורך",
+ "positionAltitude": "גובה",
+ "positionSpeed": "מהירות",
+ "positionCourse": "מסלול",
+ "positionAddress": "כתובת",
+ "positionProtocol": "פרוטוקול",
+ "positionDistance": "מרחק",
+ "positionRpm": "סל\"ד ",
+ "positionFuel": "דלק",
+ "positionPower": "מצבר",
+ "positionBattery": "סוללה",
+ "positionRaw": "גלם",
+ "positionIndex": "אינדקס",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "לווינים",
+ "positionSatVisible": "לווניינים בשימוש ",
+ "positionRssi": "RSSI",
+ "positionGps": "מערכת איתור לוונית ",
+ "positionRoaming": "נדידה",
+ "positionEvent": "אירוע",
+ "positionAlarm": "התראה",
+ "positionStatus": "סטטוס",
+ "positionOdometer": "מד מרחק",
+ "positionServiceOdometer": "טיפול לפי ספידומטר",
+ "positionTripOdometer": "מד מרחק נסיעה",
+ "positionHours": "שעות",
+ "positionSteps": "צעדים",
+ "positionInput": "כניסה",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "יציאה",
+ "positionBatteryLevel": "רמת הסוללה",
+ "positionFuelConsumption": "צריכת דלק",
+ "positionRfid": "RFID",
+ "positionVersionFw": "גרסת קושחה",
+ "positionVersionHw": "גרסת חומרה",
+ "positionIgnition": "הצתה",
+ "positionFlags": "איתות -סימון",
+ "positionCharge": "טעינה",
+ "positionIp": "כתובת IP",
+ "positionArchive": "ארכיון",
+ "positionVin": "מס זיהוי רכב יצרן",
+ "positionApproximate": "משוער",
+ "positionThrottle": "מצערת",
+ "positionMotion": "תנועה",
+ "positionArmed": "דרוך",
+ "positionAcceleration": "תאוצה",
+ "positionTemp": "טמפרטורה",
+ "positionDeviceTemp": "טמפרטורת המכשיר",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "מפעיל",
+ "positionCommand": "פקודה",
+ "positionBlocked": "חסום",
+ "positionDtcs": "מערכת תקשורת טקטית מבוזרת",
+ "positionObdSpeed": "מהירות לפי OBD",
+ "positionObdOdometer": "מד מרחק OBD",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "מזהה נהג יחודי",
+ "positionCard": "Card",
+ "positionImage": "תמונה",
+ "positionVideo": "Video",
+ "positionAudio": "קול",
+ "serverTitle": "הגדרות שרת",
+ "serverZoom": "זום",
+ "serverRegistration": "הרשמה",
+ "serverReadonly": "לקריאה בלבד",
+ "serverForceSettings": "כפה הגדרות",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "מפה",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "שכבת מפה",
+ "mapCustom": "מותאם (XYZ)",
+ "mapCustomArcgis": "מפה מותאמת (ArcGIS)",
+ "mapCustomLabel": "מפה מותאמת ",
+ "mapCarto": "Carto Basemaps\n",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "מפתח מפות בינג",
+ "mapBingRoad": "מפות כביש בינג",
+ "mapBingAerial": "מפות אוויריות בינג",
+ "mapBingHybrid": "מפות היברדיות בינג",
+ "mapBaidu": "מפות סיניות ביידו",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "מפות רוסיות Yandex",
+ "mapYandexSat": "מפות רוסיות לווין Yandex",
+ "mapWikimedia": "ויקימדיה",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "פוליגון",
+ "mapShapeCircle": "מעגל",
+ "mapShapePolyline": "צלע",
+ "mapLiveRoutes": "מסלול נסיעה",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "שכבת נק' עניין",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "מצב",
+ "stateName": "תכונה",
+ "stateValue": "ערך",
+ "commandTitle": "פקודה",
+ "commandSend": "שליחה",
+ "commandSent": "פקודה נשלחה",
+ "commandQueued": "הפקודה ממתינה ",
+ "commandUnit": "יחידה",
+ "commandCustom": "פקודה בהתאמה אישית",
+ "commandDeviceIdentification": "זיהוי מכשיר",
+ "commandPositionSingle": "דו\"ח יחיד",
+ "commandPositionPeriodic": "דיווח תקופתי",
+ "commandPositionStop": "עצור דיווח",
+ "commandEngineStop": "דומם מנוע",
+ "commandEngineResume": "הפעל מנוע",
+ "commandAlarmArm": "הפעלת אזעקה",
+ "commandAlarmDisarm": "נטרול אזעקה",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "קבע איזור זמן",
+ "commandRequestPhoto": "בקשה לתמונה",
+ "commandPowerOff": "כיבוי התקן ",
+ "commandRebootDevice": "איתחול המכשיר",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "שלח סמס",
+ "commandSendUssd": "שלח נתוני שירות משלימים לא מובנים",
+ "commandSosNumber": "קבע מספר חירום",
+ "commandSilenceTime": "קבע משך זמן הדממה",
+ "commandSetPhonebook": "הגדר ספר טלפונים",
+ "commandVoiceMessage": "הודעה קולית",
+ "commandOutputControl": "בקרת פלט",
+ "commandVoiceMonitoring": "האזנה ",
+ "commandSetAgps": "הפעל AGPS",
+ "commandSetIndicator": "הגדר מד ",
+ "commandConfiguration": "תצורה",
+ "commandGetVersion": "קבל גרסה",
+ "commandFirmwareUpdate": "עדכן גרסת חומרה",
+ "commandSetConnection": "הגדר תקשורת",
+ "commandSetOdometer": "הגדר מד מרחק",
+ "commandGetModemStatus": "הבא מצב מודם",
+ "commandGetDeviceStatus": "הבא מצב התקן ",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "מצב חיסכון בחשמל",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "תדירות",
+ "commandTimezone": "איזון אזור זמן ",
+ "commandMessage": "הודעה",
+ "commandRadius": "רדיוס",
+ "commandEnable": "מאופשר",
+ "commandData": "נתונים",
+ "commandIndex": "אינדקס",
+ "commandPhone": "טלפון",
+ "commandServer": "שרת",
+ "commandPort": "פורט",
+ "eventAll": "כל ההתראות",
+ "eventDeviceOnline": "מצב אונליין",
+ "eventDeviceUnknown": "מצב לא ידוע",
+ "eventDeviceOffline": "מצב מנותק",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "ההתקן בתנועה",
+ "eventDeviceStopped": "ההתקן עצר",
+ "eventDeviceOverspeed": "חרג מהמהירות המותרת ",
+ "eventDeviceFuelDrop": "שחרור מיכל דלק",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "תוצאות הפקודה",
+ "eventGeofenceEnter": "נכנס אל האזור המתוחם",
+ "eventGeofenceExit": "יצא מהאזור המתוחם",
+ "eventAlarm": "התראה",
+ "eventIgnitionOn": "התנעה",
+ "eventIgnitionOff": "מנוע נכבה",
+ "eventMaintenance": "תחזוקה נדרשת",
+ "eventTextMessage": "התקבלה הודעת טקסט",
+ "eventDriverChanged": "נהג הוחלף",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "גלול אל האחרון",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "כללי",
+ "alarmSos": "חירום",
+ "alarmVibration": "ויברציה",
+ "alarmMovement": "תנועה",
+ "alarmLowspeed": "מהירות נמוכה",
+ "alarmOverspeed": "עבר מהירות מותרת",
+ "alarmFallDown": "ליפול",
+ "alarmLowPower": "מצבר חלש",
+ "alarmLowBattery": "סוללה חלשה",
+ "alarmFault": "תקלה",
+ "alarmPowerOff": "כיבוי",
+ "alarmPowerOn": "הדלקה",
+ "alarmDoor": "דלת",
+ "alarmLock": "נעילה",
+ "alarmUnlock": "פתיחה",
+ "alarmGeofence": "גדר וירטואלית ",
+ "alarmGeofenceEnter": "נכנס לתחום המוגדר",
+ "alarmGeofenceExit": "יצא מהתחום המוגדר",
+ "alarmGpsAntennaCut": "ניתוק GPS",
+ "alarmAccident": "תאונה",
+ "alarmTow": "גרירה",
+ "alarmIdle": "מצב מנוחה",
+ "alarmHighRpm": "סלד גבוה",
+ "alarmHardAcceleration": "האצה חדה",
+ "alarmHardBraking": "בלימת חירום",
+ "alarmHardCornering": "פניה חדה",
+ "alarmLaneChange": "סטיה מהנתיב",
+ "alarmFatigueDriving": "עייפות נהיגה",
+ "alarmPowerCut": "ניתוק",
+ "alarmPowerRestored": "חשמל חזר",
+ "alarmJamming": "שיבוש",
+ "alarmTemperature": "טמפרטורה",
+ "alarmParking": "חניה",
+ "alarmBonnet": "מכסה מנוע",
+ "alarmFootBrake": "בלם ",
+ "alarmFuelLeak": "דליפת דלק",
+ "alarmTampering": "מפריע",
+ "alarmRemoving": "מסיר",
+ "notificationType": "סוג ההתראה",
+ "notificationAlways": "כל ההתקנים",
+ "notificationNotificators": "ערוצים",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "אתר",
+ "notificatorMail": "מייל",
+ "notificatorSms": "סמס",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "מסלול",
+ "reportEvents": "אירועים",
+ "reportTrips": "נסיעות",
+ "reportStops": "עצירות",
+ "reportSummary": "סיכום",
+ "reportDaily": "Daily Summary",
+ "reportChart": "תרשים",
+ "reportConfigure": "הגדר",
+ "reportEventTypes": "סוגי אירועים",
+ "reportChartType": "סוג תרשים",
+ "reportShowMarkers": "הצג חצים",
+ "reportExport": "יצוא",
+ "reportEmail": "דוח במייל",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "תקופה",
+ "reportCustom": "מותאם אישית",
+ "reportToday": "היום",
+ "reportYesterday": "אתמול",
+ "reportThisWeek": "השבוע",
+ "reportPreviousWeek": "שבוע שעבר",
+ "reportThisMonth": "חודש נוכחי",
+ "reportPreviousMonth": "חודש קודם",
+ "reportDeviceName": "שם המכשיר",
+ "reportAverageSpeed": "מהירות ממוצעת",
+ "reportMaximumSpeed": "מהירות מירבית",
+ "reportEngineHours": "שעות מנוע",
+ "reportDuration": "משך הנסיעה",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "זמן התחלה",
+ "reportStartAddress": "נקודת מוצא",
+ "reportEndTime": "זמן סיום",
+ "reportEndAddress": "נקודת יעד",
+ "reportSpentFuel": "צריכת דלק",
+ "reportStartOdometer": "ספידומטר קמ התחלתי",
+ "reportEndOdometer": "ספידומטר קמ סוף ",
+ "statisticsTitle": "סטטיסטיקה",
+ "statisticsCaptureTime": "פרק זמן",
+ "statisticsActiveUsers": "משתמשים פעילים",
+ "statisticsActiveDevices": "מכשירים פעילים",
+ "statisticsRequests": "בקשות",
+ "statisticsMessagesReceived": "הודעות שהתקבלו",
+ "statisticsMessagesStored": "הודעות שנשמרו",
+ "statisticsGeocoder": "בקשת מיקום גיאוגרפי\n",
+ "statisticsGeolocation": "בקשות מיקום גיאוגרפי",
+ "categoryArrow": "חץ",
+ "categoryDefault": "ברירת מחדל",
+ "categoryAnimal": "חיה",
+ "categoryBicycle": "אופניים",
+ "categoryBoat": "סירה",
+ "categoryBus": "אוטובוס",
+ "categoryCar": "רכב פרטי",
+ "categoryCamper": "Camper",
+ "categoryCrane": "מנוף",
+ "categoryHelicopter": "מסוק",
+ "categoryMotorcycle": "אופנוע",
+ "categoryOffroad": "רכב שטח",
+ "categoryPerson": "אדם",
+ "categoryPickup": "משאית קלה",
+ "categoryPlane": "מטוס",
+ "categoryShip": "ספינה",
+ "categoryTractor": "טרקטור",
+ "categoryTrain": "רכבת",
+ "categoryTram": "חשמלית ",
+ "categoryTrolleybus": "אוטובוס",
+ "categoryTruck": "משאית",
+ "categoryVan": "מסחרית",
+ "categoryScooter": "קטנוע",
+ "maintenanceStart": "התחל",
+ "maintenancePeriod": "פרק זמן "
+} \ No newline at end of file
diff --git a/legacy/web/l10n/hi.json b/legacy/web/l10n/hi.json
new file mode 100644
index 00000000..1716dc99
--- /dev/null
+++ b/legacy/web/l10n/hi.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "लोड हो रहा है...",
+ "sharedHide": "छिपाना",
+ "sharedSave": "सुरक्षित करें",
+ "sharedUpload": "Upload",
+ "sharedSet": "स्वीकृति दें",
+ "sharedCancel": "रद्द करें",
+ "sharedCopy": "Copy",
+ "sharedAdd": "जोड़ें",
+ "sharedEdit": "संपादित करें",
+ "sharedRemove": "हटाएं",
+ "sharedRemoveConfirm": "आइटम हटाएं ?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "हाँ",
+ "sharedNo": "नहीं",
+ "sharedKm": "किमी / किलोमीटर",
+ "sharedMi": "एम आई",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "के.एन.",
+ "sharedKmh": "किमी / घंटा",
+ "sharedMph": "मील प्रति घंटा",
+ "sharedHour": "घंटा",
+ "sharedMinute": "मिनट",
+ "sharedSecond": "सैकंड",
+ "sharedDays": "दिन",
+ "sharedHours": "घंटे",
+ "sharedMinutes": "मिनट",
+ "sharedDecimalDegrees": "दशमलव डिग्री",
+ "sharedDegreesDecimalMinutes": "डिग्री दशमलव मिनट",
+ "sharedDegreesMinutesSeconds": "डिग्री मिनट सेकेंड",
+ "sharedName": "नाम",
+ "sharedDescription": "विवरण",
+ "sharedSearch": "खोजें",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "जिओफेंस / भूगौलिक परिधि",
+ "sharedGeofences": "जिओफेंसस / भूगौलिक परिधियां",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "सूचनाएं",
+ "sharedNotification": "अधिसूचना",
+ "sharedAttributes": "एक से अधिक गुण",
+ "sharedAttribute": "गुण",
+ "sharedDrivers": "ड्राइवर",
+ "sharedDriver": "ड्राइवर",
+ "sharedArea": "क्षेत्र",
+ "sharedSound": "ध्वनि",
+ "sharedType": "टाइप/प्रकार",
+ "sharedDistance": "दूरी",
+ "sharedHourAbbreviation": "एच",
+ "sharedMinuteAbbreviation": "एम",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "गैल",
+ "sharedLiter": "लीटर",
+ "sharedImpGallon": "Imp. गैलन",
+ "sharedUsGallon": "U.S. गैलन",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "मानचित्र की स्तिति प्रदान करें",
+ "sharedComputedAttribute": "गणना गुण",
+ "sharedComputedAttributes": "गणना गुण",
+ "sharedCheckComputedAttribute": "गणना गुण की जांच करें",
+ "sharedExpression": "अभिव्यक्ति",
+ "sharedDevice": "उपकरण",
+ "sharedTest": "Test",
+ "sharedTestNotification": "कसौटी अधिसूचना भेजें",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "कैलेंडर",
+ "sharedCalendars": "कैलेंडर",
+ "sharedFile": "फ़ाइल",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "फ़ाइल का चयन करें",
+ "sharedPhone": "फ़ोन",
+ "sharedRequired": "अपेक्षित",
+ "sharedPreferences": "प्राथमिकताएं",
+ "sharedPermissions": "अनुमतियां",
+ "sharedConnections": "Connections",
+ "sharedExtra": "अतिरिक्त",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Number",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "समय क्षेत्र",
+ "sharedInfoTitle": "जानकारी",
+ "sharedSavedCommand": "संग्रहीत आदेश",
+ "sharedSavedCommands": "संग्रहीत आदेश",
+ "sharedNew": "नई…",
+ "sharedShowAddress": "पता दिखाएं",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "अक्षम करें",
+ "sharedMaintenance": "रखरखाव",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "गति सीमा",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "पॉलीलाइन दूरी",
+ "attributeReportIgnoreOdometer": "रिपोर्ट: ओडोमीटर को अनदेखा करें",
+ "attributeWebReportColor": "वेब: रिपोर्ट रंग",
+ "attributeDevicePassword": "उपकरण पासवर्ड",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "प्रसंस्करण: गुण कॉपी करें",
+ "attributeColor": "रंग",
+ "attributeWebLiveRouteLength": "वेब: लाइव मार्ग लंबाई",
+ "attributeWebSelectZoom": "वेब: ज़ूम पर चुनना",
+ "attributeWebMaxZoom": "वेब: अधिकतम ज़ूम",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "मेल: एसएमटीपी होस्ट",
+ "attributeMailSmtpPort": "मेल: एसएमटीपी पोर्ट",
+ "attributeMailSmtpStarttlsEnable": "मेल: एसएमटीपी स्टार्ट्स सक्षम करें",
+ "attributeMailSmtpStarttlsRequired": "मेल: एसएमटीपी स्टार्टल्स आवश्यक है",
+ "attributeMailSmtpSslEnable": "मेल: एसएमटीपी एसएसएल सक्षम करें",
+ "attributeMailSmtpSslTrust": "मेल: एसएमटीपी एसएसएल ट्रस्ट",
+ "attributeMailSmtpSslProtocols": "मेल: एसएमटीपी एसएसएल प्रोटोकॉल",
+ "attributeMailSmtpFrom": "मेल: एसएमटीपी से",
+ "attributeMailSmtpAuth": "मेल: एसएमटीपी प्रमाण सक्षम करें",
+ "attributeMailSmtpUsername": "मेल: एसएमटीपी उपयोगकर्ता नाम",
+ "attributeMailSmtpPassword": "मेल: एसएमटीपी पासवर्ड",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "यूआई: घटनाओं को अक्षम करें",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "यूआई: ड्राइवर्स को अक्षम करें",
+ "attributeUiDisableComputedAttributes": "यूआई: गणना गुणों को अक्षम करें",
+ "attributeUiDisableCalendars": "यूआई: कैलेंडर अक्षम करें",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "यूआई: स्थिति गुण छुपाएं",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "त्रुटि",
+ "errorGeneral": "अमान्य पैरामीटर या बाधाओं का उल्लंघन",
+ "errorConnection": "कनेक्शन त्रुटि",
+ "errorSocket": "वेब सॉकेट कनेक्शन त्रुटि",
+ "errorZero": "शून्य नहीं हो सकता",
+ "userEmail": "ईमेल",
+ "userPassword": "पासवर्ड / गोपनीय शब्द",
+ "userAdmin": "एडमिन / व्यवस्थापक",
+ "userRemember": "याद रखें",
+ "userExpirationTime": "समय सीमा समाप्ति",
+ "userDeviceLimit": "उपकरण सीमा",
+ "userUserLimit": "उपयोगकर्ता सीमा",
+ "userDeviceReadonly": "उपकरण केवल पढ़ने के लिए",
+ "userLimitCommands": "सीमा कमांड",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "टोकन",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "लॉगिन / प्रवेश करें",
+ "loginLanguage": "भाषा",
+ "loginReset": "Reset Password",
+ "loginRegister": "रजिस्टर / पंजीकृत करें",
+ "loginLogin": "लॉगिन / प्रवेश करें",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "ई-मेल पता या पासवर्ड गलत है",
+ "loginCreated": "नया उपयोगकर्ता पंजीकृत हो गया है",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "लॉगआउट / निष्कासन करें",
+ "loginLogo": "लोगो",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "उपकरण एवम स्तिति",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "उपकरण",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "पहचानकर्ता",
+ "deviceModel": "आदर्श",
+ "deviceContact": "संपर्क",
+ "deviceCategory": "श्रेणी",
+ "deviceLastUpdate": "आखिरी अद्यतन / ताज़ा जानकारी",
+ "deviceCommand": "आदेश",
+ "deviceFollow": "पालन / अनुकरण करें",
+ "deviceTotalDistance": "कुल दूरी",
+ "deviceStatus": "स्थिति",
+ "deviceStatusOnline": "ऑनलाइन",
+ "deviceStatusOffline": "ऑफ़लाइन",
+ "deviceStatusUnknown": "अज्ञात",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "समूह",
+ "groupParent": "समूह",
+ "groupNoGroup": "कोई समूह नहीं",
+ "settingsTitle": "सेटिंग्स",
+ "settingsUser": "अकाउंट / लेखा",
+ "settingsGroups": "ग्रुप्स / एक से अधिक समूह",
+ "settingsServer": "सर्वर",
+ "settingsUsers": "एक से अधिक उपयोगकर्ता",
+ "settingsDistanceUnit": "दूरी इकाई",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "स्पीड यूनिट",
+ "settingsVolumeUnit": "वॉल्यूम यूनिट",
+ "settingsTwelveHourFormat": "12 - घंटा का प्रारूप",
+ "settingsCoordinateFormat": "समन्वय प्रारूप",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "रिपोर्ट्स / एक से अधिक रिपोर्ट / विवरण",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "उपकरण",
+ "reportGroup": "समूह",
+ "reportFrom": "से",
+ "reportTo": "तक",
+ "reportShow": "दिखाएं",
+ "reportClear": "स्पष्ट / साफ़",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "मान्य / वैध",
+ "positionAccuracy": "शुद्धता",
+ "positionLatitude": "अक्षांश / अक्षरेखा",
+ "positionLongitude": "देशान्तर",
+ "positionAltitude": "ऊंचाई",
+ "positionSpeed": "गति",
+ "positionCourse": "मार्ग",
+ "positionAddress": "पता",
+ "positionProtocol": "प्रोटोकॉल",
+ "positionDistance": "दूरी",
+ "positionRpm": "आरपीएम",
+ "positionFuel": "ईंधन",
+ "positionPower": "शक्ति",
+ "positionBattery": "बैटरी",
+ "positionRaw": "कच्चा",
+ "positionIndex": "सूची",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "उपग्रहों",
+ "positionSatVisible": "दृश्यमान उपग्रह",
+ "positionRssi": "RSSI",
+ "positionGps": "जीपीएस",
+ "positionRoaming": "रोमिंग",
+ "positionEvent": "घटना",
+ "positionAlarm": "अलार्म",
+ "positionStatus": "स्थिति",
+ "positionOdometer": "ओडोमीटर",
+ "positionServiceOdometer": "सेवा ओडोमीटर",
+ "positionTripOdometer": "ट्रिप ओडोमीटर",
+ "positionHours": "घंटे",
+ "positionSteps": "कदम",
+ "positionInput": "इनपुट",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "उत्पादन",
+ "positionBatteryLevel": "बैटरी स्तर",
+ "positionFuelConsumption": "ईंधन उपभोग",
+ "positionRfid": "आरएफआईडी",
+ "positionVersionFw": "फर्मवेयर संस्करण",
+ "positionVersionHw": "हार्डवेयर संस्करण",
+ "positionIgnition": "इग्निशन",
+ "positionFlags": "झंडे",
+ "positionCharge": "चार्ज",
+ "positionIp": "आईपी",
+ "positionArchive": "पुरालेख",
+ "positionVin": "VIN",
+ "positionApproximate": "लगभग",
+ "positionThrottle": "Throttle",
+ "positionMotion": "चलती",
+ "positionArmed": "हथियारबंद",
+ "positionAcceleration": "त्वरण",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "उपकरण तापमान",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "ऑपरेटर",
+ "positionCommand": "आदेश",
+ "positionBlocked": "अवरुद्ध",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "ओबीडी गति",
+ "positionObdOdometer": "ओबीडी ओडोमीटर",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "चालक अद्वितीय आईडी",
+ "positionCard": "Card",
+ "positionImage": "छवि",
+ "positionVideo": "Video",
+ "positionAudio": "ऑडियो",
+ "serverTitle": "सर्वर की सेटिंग्स",
+ "serverZoom": "ज़ूम",
+ "serverRegistration": "पंजीकरण",
+ "serverReadonly": "केवल पठीय / पड़ने के लिए",
+ "serverForceSettings": "बल सेटिंग्स",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "मानचित्र",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "मानचित्र की परत",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "बिंग मैप्स की कुंजी",
+ "mapBingRoad": "बिंग मैप्स रोड / सड़क",
+ "mapBingAerial": "बिंग मैप्स एरियल",
+ "mapBingHybrid": "बिंग मैप्स हाइब्रिड",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "यांडेक्स मानचित्र",
+ "mapYandexSat": "यांडेक्स सैटेलाइट",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "बहुभुज",
+ "mapShapeCircle": "वृत्त",
+ "mapShapePolyline": "पाली लाइन",
+ "mapLiveRoutes": "लाइव मार्ग",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "पीओआई परत",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "स्थिति / अवस्ता",
+ "stateName": "गुण",
+ "stateValue": "मान / वेल्यु",
+ "commandTitle": "आदेश",
+ "commandSend": "भेजें / प्रेषित करें",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "इकाई",
+ "commandCustom": "विशिष्ट रूप से निर्मित मेसेज / संदेश",
+ "commandDeviceIdentification": "उपकरण की पहचान",
+ "commandPositionSingle": "एक बार की रिपोर्टिंग",
+ "commandPositionPeriodic": "आवधिक रिपोर्टिंग",
+ "commandPositionStop": "रिपोर्टिंग रोकें",
+ "commandEngineStop": "इंजन बंद",
+ "commandEngineResume": "इंजन फिर से शुरू",
+ "commandAlarmArm": "अलार्म लगाएं",
+ "commandAlarmDisarm": "अलार्म हटाएं",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "समय क्षेत्र सेट करें",
+ "commandRequestPhoto": "फोटो मँगवाएं",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "उपकरण बंद करके पुन्ह आरंभ करें",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "एसएमएस भेजें / प्रेषित करें",
+ "commandSendUssd": "यूएसएसडी कोड भेजें / प्रेषित करें",
+ "commandSosNumber": "एसओएस / एमर्जेन्सी फोन नंबर सेट करें",
+ "commandSilenceTime": "खामोशी का समय सेट करें",
+ "commandSetPhonebook": "फोनबुक सेट करें",
+ "commandVoiceMessage": "ध्वनि संदेश / वाय्स मेसेज",
+ "commandOutputControl": "आउटपुट नियंत्रण",
+ "commandVoiceMonitoring": "आवाज निगरानी",
+ "commandSetAgps": "एजीपीएस सेट करें",
+ "commandSetIndicator": "संकेतक सेट करें",
+ "commandConfiguration": "विन्यास",
+ "commandGetVersion": "संस्करण प्राप्त करें",
+ "commandFirmwareUpdate": "फर्मवेयर अपडेट करें",
+ "commandSetConnection": "कनेक्शन सेट करें",
+ "commandSetOdometer": "ओडोमीटर सेट करें",
+ "commandGetModemStatus": "मोडेम स्थिति प्राप्त करें",
+ "commandGetDeviceStatus": "उपकरण स्थिति प्राप्त करें",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "फ्रीक्वेंसी / आवृत्ति",
+ "commandTimezone": "टाइमज़ोन ऑफ़सेट",
+ "commandMessage": "संदेश / मेसेज",
+ "commandRadius": "त्रिज्या",
+ "commandEnable": "सक्षम करें",
+ "commandData": "डाटा / आंकड़े",
+ "commandIndex": "अनुक्रमणिका",
+ "commandPhone": "फोन नंबर",
+ "commandServer": "सर्वर",
+ "commandPort": "पोर्ट",
+ "eventAll": "सभी घटनाएँ / इवेंट्स",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "आदेश / क्मांड का परिणाम",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "रखरखाव की आवश्यकता है",
+ "eventTextMessage": "पाठ संदेश प्राप्त हुआ",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "अंतिम तक स्क्रॉल करें",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "सूचना का प्रकार",
+ "notificationAlways": "सभी उपकरण",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "मार्ग",
+ "reportEvents": "घटनाएँ / इवेंट्स",
+ "reportTrips": "यात्राएँ / ट्रिप्स",
+ "reportStops": "Stops",
+ "reportSummary": "सारांश",
+ "reportDaily": "Daily Summary",
+ "reportChart": "चार्ट",
+ "reportConfigure": "समनुरूप / कन्फिगर करें",
+ "reportEventTypes": "घटनाओं / इवेंट्स के प्रकार",
+ "reportChartType": "चार्ट टाइप",
+ "reportShowMarkers": "मार्कर दिखाएं",
+ "reportExport": "निर्यात",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "अवधि",
+ "reportCustom": "Custom",
+ "reportToday": "आज",
+ "reportYesterday": "कल",
+ "reportThisWeek": "इस सप्ताह",
+ "reportPreviousWeek": "पिछले सप्ताह",
+ "reportThisMonth": "इस महीने",
+ "reportPreviousMonth": "पिछले महीने",
+ "reportDeviceName": "उपकरण / उपकरण का नाम",
+ "reportAverageSpeed": "औसत गति",
+ "reportMaximumSpeed": "अधिकतम गति",
+ "reportEngineHours": "इंजन के घंटे",
+ "reportDuration": "अवधि",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "समय का आरंभ",
+ "reportStartAddress": "प्रारंभ पता",
+ "reportEndTime": "अंतिम समय",
+ "reportEndAddress": "अंत पता",
+ "reportSpentFuel": "ईंधन खर्च",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "आंकड़े",
+ "statisticsCaptureTime": "समय कैप्चर करें",
+ "statisticsActiveUsers": "सक्रिय उपयोगकर्ता",
+ "statisticsActiveDevices": "सक्रिय उपकरण",
+ "statisticsRequests": "अनुरोध",
+ "statisticsMessagesReceived": "संदेश प्राप्त हुए",
+ "statisticsMessagesStored": "संदेश संग्रहीत",
+ "statisticsGeocoder": "जियोकोडर अनुरोध",
+ "statisticsGeolocation": "जियोलोकेशन अनुरोध",
+ "categoryArrow": "तीर",
+ "categoryDefault": "Default",
+ "categoryAnimal": "पशु",
+ "categoryBicycle": "साइकिल",
+ "categoryBoat": "नाव",
+ "categoryBus": "बस",
+ "categoryCar": "कार",
+ "categoryCamper": "Camper",
+ "categoryCrane": "क्रेन",
+ "categoryHelicopter": "हेलीकाप्टर",
+ "categoryMotorcycle": "मोटरसाइकिल",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "व्यक्ति",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "विमान",
+ "categoryShip": "जहाज़",
+ "categoryTractor": "ट्रैक्टर",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "ट्रक",
+ "categoryVan": "वैन",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "प्रारंभ",
+ "maintenancePeriod": "अवधि"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/hr.json b/legacy/web/l10n/hr.json
new file mode 100644
index 00000000..f64cdb04
--- /dev/null
+++ b/legacy/web/l10n/hr.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Učitavanje...",
+ "sharedHide": "Sakrij",
+ "sharedSave": "Spremi",
+ "sharedUpload": "Upload",
+ "sharedSet": "Postavi",
+ "sharedCancel": "Poništi",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Dodaj",
+ "sharedEdit": "Uredi",
+ "sharedRemove": "Ukloni",
+ "sharedRemoveConfirm": "Ukloniti stavku?",
+ "sharedNoData": "Nema podataka",
+ "sharedSubject": "Subject",
+ "sharedYes": "Da",
+ "sharedNo": "Ne",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "čv",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Sat",
+ "sharedMinute": "Minuta",
+ "sharedSecond": "Sekunda",
+ "sharedDays": "dani",
+ "sharedHours": "sati",
+ "sharedMinutes": "minuta",
+ "sharedDecimalDegrees": "Decimalni stupnjevi",
+ "sharedDegreesDecimalMinutes": "Stupnjevi u decimalnim minutama",
+ "sharedDegreesMinutesSeconds": "Stupnjevi u minutama i sekundama",
+ "sharedName": "Ime",
+ "sharedDescription": "Opis",
+ "sharedSearch": "Pretraži",
+ "sharedIconScale": "Skaliraj ikonu",
+ "sharedGeofence": "Geo-ograda",
+ "sharedGeofences": "Geo-ograde",
+ "sharedCreateGeofence": "Kreiraj geo-ogradu",
+ "sharedNotifications": "Obavijesti",
+ "sharedNotification": "Obavijest",
+ "sharedAttributes": "Atributi",
+ "sharedAttribute": "Atribut",
+ "sharedDrivers": "Vozači",
+ "sharedDriver": "Vozač",
+ "sharedArea": "Područje",
+ "sharedSound": "Zvuk obavijesti",
+ "sharedType": "Tip",
+ "sharedDistance": "Udaljenost",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "galon",
+ "sharedLiter": "Litra",
+ "sharedImpGallon": "Imperijalni galon",
+ "sharedUsGallon": "američki galon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Dohvati stanje karte",
+ "sharedComputedAttribute": "Izračunati atribut",
+ "sharedComputedAttributes": "Izračunati atributi",
+ "sharedCheckComputedAttribute": "Provjeri izračunati atribut",
+ "sharedExpression": "Izraz",
+ "sharedDevice": "Uređaj",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Pošalji testnu obavijest",
+ "sharedTestNotificators": "Testiraj kanale",
+ "sharedTestExpression": "Testiraj izraz",
+ "sharedCalendar": "Kalendar",
+ "sharedCalendars": "Kalendari",
+ "sharedFile": "Datoteka",
+ "sharedSearchDevices": "Traži uređaje",
+ "sharedSortBy": "Sortiraj po",
+ "sharedFilterMap": "Filtriraj na karti",
+ "sharedSelectFile": "Odaberi datoteku",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Potrebno",
+ "sharedPreferences": "Postavke",
+ "sharedPermissions": "Dozvole",
+ "sharedConnections": "Veze",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primarno",
+ "sharedSecondary": "Sekundarno",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Broj",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Vremenska zona",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Snimljena naredba",
+ "sharedSavedCommands": "Snimljene naredbe",
+ "sharedNew": "Novo",
+ "sharedShowAddress": "Prikaži adresu",
+ "sharedShowDetails": "Više detalja",
+ "sharedDisabled": "Isključeno",
+ "sharedMaintenance": "Održavanje",
+ "sharedDeviceAccumulators": "Varijable",
+ "sharedAlarms": "Alarmi",
+ "sharedLocation": "Lokacija",
+ "sharedImport": "Uvoz",
+ "sharedColumns": "Stupac",
+ "sharedDropzoneText": "Dovuci i pusti datoteku ovdje ili klikni",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Jednostavno",
+ "calendarRecurrence": "Ponavljajuće",
+ "calendarOnce": "Jednom",
+ "calendarDaily": "Dnevno",
+ "calendarWeekly": "Tjedno",
+ "calendarMonthly": "Mjesečno",
+ "calendarDays": "Dani",
+ "calendarSunday": "Nedjelja",
+ "calendarMonday": "Ponedjeljak",
+ "calendarTuesday": "Utorak",
+ "calendarWednesday": "Srijeda",
+ "calendarThursday": "Četvrtak",
+ "calendarFriday": "Petak",
+ "calendarSaturday": "Subota",
+ "attributeShowGeofences": "Pokaži geo-ograde",
+ "attributeSpeedLimit": "Ograničenje brzine",
+ "attributeFuelDropThreshold": "Gorivo je ispod zadane vrijednosti",
+ "attributeFuelIncreaseThreshold": "Gorivo je iznad zadane vrijednosti",
+ "attributePolylineDistance": "Udaljenost linijom",
+ "attributeReportIgnoreOdometer": "Izvještaj: ignoriraj kilometražu",
+ "attributeWebReportColor": "Web: Boja izvještaja",
+ "attributeDevicePassword": "Lozinka uređaja",
+ "attributeDeviceImage": "Slika uređaja",
+ "attributeDeviceInactivityStart": "Neaktivnost uređaja",
+ "attributeDeviceInactivityPeriod": "Vrijeme neaktivnosti uređaja",
+ "attributeProcessingCopyAttributes": "Obrada: Kopiraj atribute",
+ "attributeColor": "Boja",
+ "attributeWebLiveRouteLength": "Web: Udaljenost rute uživo",
+ "attributeWebSelectZoom": "Web: Približi kod odabira",
+ "attributeWebMaxZoom": "Web: Maksimalni zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Proslijedi ključ korisnika",
+ "attributePushoverDeviceNames": "Proslijedi imena uređaja",
+ "attributeMailSmtpHost": "Mail: SMTP poslužitelj",
+ "attributeMailSmtpPort": "Mail: SMTP port",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS uključen",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS potreban",
+ "attributeMailSmtpSslEnable": "Mail: SMTP SSL uključen",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL protokoli",
+ "attributeMailSmtpFrom": "Mail: SMTP pošiljatelj",
+ "attributeMailSmtpAuth": "Mail: SMTP uključi autentikaciju",
+ "attributeMailSmtpUsername": "Mail: SMTP korisničko ime",
+ "attributeMailSmtpPassword": "Mail: SMTP lozinka",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Onemogući atribute",
+ "attributeUiDisableGroups": "UI: Onemogući grupe",
+ "attributeUiDisableEvents": "UI: Isključi događaje",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Isključi vozače",
+ "attributeUiDisableComputedAttributes": "UI: Isključi izračunate atribute",
+ "attributeUiDisableCalendars": "UI: Isključi kalendare",
+ "attributeUiDisableMaintenance": "UI: Isključi održavanje",
+ "attributeUiHidePositionAttributes": "UI: Sakrij atribute pozicioniranja",
+ "attributeUiDisableLoginLanguage": "UI: Onemogući jezik prilikom logina",
+ "attributeNotificationTokens": "Token za notifikacije",
+ "attributePopupInfo": "Popup info",
+ "errorTitle": "Greška",
+ "errorGeneral": "Nevažeći parametri ili kršenje ograničenja",
+ "errorConnection": "Greška konekcije",
+ "errorSocket": "WebSocket konekcijska greška",
+ "errorZero": "Ne može biti nula.",
+ "userEmail": "E-mail",
+ "userPassword": "Lozinka",
+ "userAdmin": "Administrator",
+ "userRemember": "Zapamti",
+ "userExpirationTime": "Vrijeme isteka",
+ "userDeviceLimit": "Maksimalni broj uređaja",
+ "userUserLimit": "Maksimalni broj korisnika",
+ "userDeviceReadonly": "Onemogući dodavanje uređaja",
+ "userLimitCommands": "Ograniči komande",
+ "userDisableReports": "Onemogući izvještaje",
+ "userFixedEmail": "Zabrani promjenu e-pošte",
+ "userToken": "Token",
+ "userDeleteAccount": "Obriši račun",
+ "userTemporary": "Temporary",
+ "loginTitle": "Prijava",
+ "loginLanguage": "Jezik",
+ "loginReset": "Ponovo postavi lozinku",
+ "loginRegister": "Registracija",
+ "loginLogin": "Prijava",
+ "loginOpenId": "Prijavi se sa OpenID-om",
+ "loginFailed": "Netočna e-mail adresa ili password",
+ "loginCreated": "Registiran je novi korisnik",
+ "loginResetSuccess": "Provjeri e-poštu",
+ "loginUpdateSuccess": "Postavljena je nova lozinka",
+ "loginLogout": "Odjava",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Uređaji i stanje",
+ "deviceSelected": "Odabrani uređaj",
+ "deviceTitle": "Uređaji",
+ "devicePrimaryInfo": "Ime uređaja",
+ "deviceSecondaryInfo": "Detalji uređaja",
+ "deviceIdentifier": "Identifikator",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategorija",
+ "deviceLastUpdate": "Zadnje ažuriranje",
+ "deviceCommand": "Naredba",
+ "deviceFollow": "Prati",
+ "deviceTotalDistance": "Ukupna udaljenost",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Nepoznato",
+ "deviceRegisterFirst": "Prijavi svoj prvi uređaj",
+ "deviceIdentifierHelp": "IMEI, serijski broj ili drugi ID mora biti jednak identifikatoru uređaja koji se prijavljuje na poslužitelj",
+ "deviceShare": "Share Device",
+ "groupDialog": "Grupa",
+ "groupParent": "Grupa",
+ "groupNoGroup": "Bez grupe",
+ "settingsTitle": "Postavke",
+ "settingsUser": "Račun",
+ "settingsGroups": "Grupe",
+ "settingsServer": "Server",
+ "settingsUsers": "Korisnici",
+ "settingsDistanceUnit": "Jedinica udaljenosti",
+ "settingsAltitudeUnit": "Mjerna jedinica za visinu",
+ "settingsSpeedUnit": "Jedinica brzine",
+ "settingsVolumeUnit": "Mjerna jedinica za volumen",
+ "settingsTwelveHourFormat": "12-satno vrijeme",
+ "settingsCoordinateFormat": "Format koordinata",
+ "settingsServerVersion": "Verzija poslužitelja",
+ "settingsAppVersion": "Verzija aplikacije",
+ "settingsConnection": "Veza",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Izvještaji",
+ "reportScheduled": "Redovni izvještaj",
+ "reportDevice": "Uređaj",
+ "reportGroup": "Grupa",
+ "reportFrom": "Od",
+ "reportTo": "Za",
+ "reportShow": "Prikaži",
+ "reportClear": "Očisti",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fiksno vrijeme",
+ "positionDeviceTime": "Vrijeme na uređaju",
+ "positionServerTime": "Vrijeme na poslužitelju",
+ "positionValid": "Važeće",
+ "positionAccuracy": "Preciznost",
+ "positionLatitude": "Širina",
+ "positionLongitude": "Dužina",
+ "positionAltitude": "Visina",
+ "positionSpeed": "Brzina",
+ "positionCourse": "Kurs",
+ "positionAddress": "Adresa",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Udaljenost",
+ "positionRpm": "O/min",
+ "positionFuel": "Gorivo",
+ "positionPower": "Napajanje",
+ "positionBattery": "Baterija",
+ "positionRaw": "Sirovi podaci",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Sateliti",
+ "positionSatVisible": "Vidljivi sateliti",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roming",
+ "positionEvent": "Događaj",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Stanje",
+ "positionOdometer": "Kilometraža",
+ "positionServiceOdometer": "Kilometara do servisa",
+ "positionTripOdometer": "Kilometraža puta",
+ "positionHours": "Sati",
+ "positionSteps": "Koraci",
+ "positionInput": "Ulaz",
+ "positionHeartRate": "Otkucaji srca",
+ "positionOutput": "Izlaz",
+ "positionBatteryLevel": "Razina baterije",
+ "positionFuelConsumption": "Potrošnja goriva",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Verzija firmwarea",
+ "positionVersionHw": "Verzija hadrvera",
+ "positionIgnition": "Paljenje",
+ "positionFlags": "Zastavice",
+ "positionCharge": "Punjenje",
+ "positionIp": "IP",
+ "positionArchive": "Arhiva",
+ "positionVin": "VIN",
+ "positionApproximate": "Približno",
+ "positionThrottle": "Gas",
+ "positionMotion": "Kretanje",
+ "positionArmed": "Aktivirano",
+ "positionAcceleration": "Ubrzavanje",
+ "positionTemp": "Temperatura",
+ "positionDeviceTemp": "Temperatura uređaja",
+ "positionCoolantTemp": "Temperatura rashladne tekućine",
+ "positionOperator": "Operater",
+ "positionCommand": "Naredba",
+ "positionBlocked": "Blokirano",
+ "positionDtcs": "DTC kodovi",
+ "positionObdSpeed": "OBD brzina",
+ "positionObdOdometer": "OBD kilometraža",
+ "positionDrivingTime": "Vrijeme vožnje",
+ "positionDriverUniqueId": "Vozačev jedinstveni ID",
+ "positionCard": "Kartica",
+ "positionImage": "Slika",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Postavke poslužitelja",
+ "serverZoom": "Povećanje",
+ "serverRegistration": "Registracija",
+ "serverReadonly": "Samo pregledavanje",
+ "serverForceSettings": "Nametni postavke",
+ "serverAnnouncement": "Najava",
+ "serverName": "Ime poslužitelja",
+ "serverDescription": "Opis poslužitelja",
+ "serverColorPrimary": "Primarna boja",
+ "serverColorSecondary": "Sekundarna boja",
+ "serverLogo": "Logo",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Karta",
+ "mapActive": "Aktivna karta",
+ "mapOverlay": "Prekrivajuća karta",
+ "mapOverlayCustom": "Prilagođeno prekrivanje",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API ključ",
+ "mapOpenWeatherClouds": "OpenWeather oblaci",
+ "mapOpenWeatherPrecipitation": "OpenWeather oborine",
+ "mapOpenWeatherPressure": "OpenWeather tlak",
+ "mapOpenWeatherWind": "OpenWeather vjetar",
+ "mapOpenWeatherTemperature": "OpenWeather temperatura",
+ "mapLayer": "Sloj karte",
+ "mapCustom": "Prilagođeno (XYZ)",
+ "mapCustomArcgis": "Prilagođeno (ArcGIS)",
+ "mapCustomLabel": "Prilagođena karta",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox ulice",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox izvana",
+ "mapMapboxSatellite": "Mapbox satelit",
+ "mapMapboxKey": "Mapbox pristupni ključ",
+ "mapMapTilerBasic": "MapTiler osnovno",
+ "mapMapTilerHybrid": "MapTiler hibrid",
+ "mapMapTilerKey": "MapTiler API ključ",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ pristupni ključ",
+ "mapTomTomBasic": "TomTom osnovno",
+ "mapTomTomFlow": "TomTom prikaz prometa",
+ "mapTomTomIncidents": "TomTom prometne nesreće",
+ "mapTomTomKey": "TomTom API ključ",
+ "mapHereBasic": "Here osnovno",
+ "mapHereHybrid": "Here hibridno",
+ "mapHereSatellite": "Here satelit",
+ "mapHereFlow": "Here prikaz prometa",
+ "mapHereKey": "Here API ključ",
+ "mapShapePolygon": "Mnogokut",
+ "mapShapeCircle": "Krug",
+ "mapShapePolyline": "Razlomljena linija",
+ "mapLiveRoutes": "Rute uživo",
+ "mapDirection": "Pokaži smjer",
+ "mapCurrentLocation": "Trenutna lokacija",
+ "mapPoiLayer": "Točke interesa sloj",
+ "mapClustering": "Organizacija markera",
+ "mapOnSelect": "Prikaži kartu na odabranom",
+ "mapDefault": "Zadana karta",
+ "stateTitle": "Stanje",
+ "stateName": "Atribut",
+ "stateValue": "Vrijednost",
+ "commandTitle": "Naredba",
+ "commandSend": "Pošalji",
+ "commandSent": "Naredba poslana",
+ "commandQueued": "Naredba u redu čekanja",
+ "commandUnit": "Jedinica",
+ "commandCustom": "Prilagođena naredba",
+ "commandDeviceIdentification": "Identifikacija uređaja",
+ "commandPositionSingle": "Jedan izvještaj",
+ "commandPositionPeriodic": "Periodično izvješćivanje",
+ "commandPositionStop": "Zaustavi izvješćivanje",
+ "commandEngineStop": "Zaustavi motor",
+ "commandEngineResume": "Pokreni motor",
+ "commandAlarmArm": "Aktiviraj alarm",
+ "commandAlarmDisarm": "Deaktiviraj alarm",
+ "commandAlarmDismiss": "Zanemari alarm",
+ "commandSetTimezone": "Postavi vremensku zonu",
+ "commandRequestPhoto": "Zatraži sliku",
+ "commandPowerOff": "Isključi uređaj",
+ "commandRebootDevice": "Ponovno pokretanje uređaja",
+ "commandFactoryReset": "Tvorničko postavljanje",
+ "commandSendSms": "Pošalji SMS",
+ "commandSendUssd": "Pošalji USSD",
+ "commandSosNumber": "Postavi SOS broj",
+ "commandSilenceTime": "Postavi vrijeme tišine",
+ "commandSetPhonebook": "Postavi imenik",
+ "commandVoiceMessage": "Glasovna poruka",
+ "commandOutputControl": "Kontrola izlaza",
+ "commandVoiceMonitoring": "Nadzor glasa",
+ "commandSetAgps": "Postavi AGPS",
+ "commandSetIndicator": "Postavi indikator",
+ "commandConfiguration": "Konfiguracija",
+ "commandGetVersion": "Provjeri verzij",
+ "commandFirmwareUpdate": "Nadogradi firmware",
+ "commandSetConnection": "Postavi vezu",
+ "commandSetOdometer": "Postavi odometar",
+ "commandGetModemStatus": "Dohvati status modema",
+ "commandGetDeviceStatus": "Dohvati status uređaja",
+ "commandSetSpeedLimit": "Postavi ograničenje brzine",
+ "commandModePowerSaving": "Način uštede energije",
+ "commandModeDeepSleep": "Način dubokog sna",
+ "commandAlarmGeofence": "Postavi alarm za geo-ogradu",
+ "commandAlarmBattery": "Postavi alarm za bateriju",
+ "commandAlarmSos": "Postavi SOS alarm",
+ "commandAlarmRemove": "Ukloni alarm",
+ "commandAlarmClock": "Postavi alarm na vrijeme",
+ "commandAlarmSpeed": "Postavi alarm za brzinu",
+ "commandAlarmFall": "Postavi alarm za pad",
+ "commandAlarmVibration": "Postavi alarm za vribracije",
+ "commandFrequency": "Učestalost",
+ "commandTimezone": "Korekcija vremenske zone",
+ "commandMessage": "Poruka",
+ "commandRadius": "Radius",
+ "commandEnable": "Uključ",
+ "commandData": "Podaci",
+ "commandIndex": "Indeks",
+ "commandPhone": "Telefonski broj",
+ "commandServer": "Poslužitelj",
+ "commandPort": "Port",
+ "eventAll": "Svi događaji",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status nepoznat",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Uređaj neaktivan",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Uređaj se pomiče",
+ "eventDeviceStopped": "Uređaj zaustavljen",
+ "eventDeviceOverspeed": "Prekoračeno ograničenje brzine",
+ "eventDeviceFuelDrop": "Pad količine goriva",
+ "eventDeviceFuelIncrease": "Porast goriva",
+ "eventCommandResult": "Rezultat naredbe",
+ "eventGeofenceEnter": "Ulaz u geo-ogradu",
+ "eventGeofenceExit": "Izlaz iz geo-ograde",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Vozilo upaljeno",
+ "eventIgnitionOff": "Vozilo isključeno",
+ "eventMaintenance": "Potrebno održavanje",
+ "eventTextMessage": "Primljena tekstualna poruka",
+ "eventDriverChanged": "Vozač promijenjen",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Pomakni na zadnji",
+ "eventsSoundEvents": "Zvučni događaji",
+ "eventsSoundAlarms": "Zvučni alarm",
+ "alarmGeneral": "Općenito",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibracija",
+ "alarmMovement": "Pokret",
+ "alarmLowspeed": "Niska brzina",
+ "alarmOverspeed": "Prekoračena brzina",
+ "alarmFallDown": "Pad",
+ "alarmLowPower": "Niska energija",
+ "alarmLowBattery": "Nizak napon baterije",
+ "alarmFault": "Greška",
+ "alarmPowerOff": "Gašenje vozila",
+ "alarmPowerOn": "Paljenje vozila",
+ "alarmDoor": "Vrata",
+ "alarmLock": "Zaključavanje",
+ "alarmUnlock": "Otključavanje",
+ "alarmGeofence": "Geo-ograda",
+ "alarmGeofenceEnter": "Ulaz u geo-ogradu",
+ "alarmGeofenceExit": "Izlaz iz geo-ograde",
+ "alarmGpsAntennaCut": "GPS antena uklonjena",
+ "alarmAccident": "Nesreća",
+ "alarmTow": "Vuča",
+ "alarmIdle": "Prazan hod",
+ "alarmHighRpm": "Visoki okretaji",
+ "alarmHardAcceleration": "Naglo kretanje",
+ "alarmHardBraking": "Naglo kočenje",
+ "alarmHardCornering": "Nagli ulaz u zavoj",
+ "alarmLaneChange": "Promjena trake",
+ "alarmFatigueDriving": "Umorna vožnja",
+ "alarmPowerCut": "Napajanje uklonjeno",
+ "alarmPowerRestored": "Napajanje vraćeno",
+ "alarmJamming": "Ometanje",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Hauba",
+ "alarmFootBrake": "Kočnica",
+ "alarmFuelLeak": "Curenje goriva",
+ "alarmTampering": "Petljanje",
+ "alarmRemoving": "Uklanjanje",
+ "notificationType": "Tip obavijesti",
+ "notificationAlways": "Svi uređaji",
+ "notificationNotificators": "Kanali",
+ "notificatorCommand": "Naredba",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Email",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pošalji",
+ "reportReplay": "Ponovi",
+ "reportCombined": "Kombinirano",
+ "reportRoute": "Ruta",
+ "reportEvents": "Događaji",
+ "reportTrips": "Putovanja",
+ "reportStops": "Zaustavljanja",
+ "reportSummary": "Sažetak",
+ "reportDaily": "Dnevni izvještaj",
+ "reportChart": "Graf",
+ "reportConfigure": "Konfiguriraj",
+ "reportEventTypes": "Vrste događaja",
+ "reportChartType": "Vrsta grafa",
+ "reportShowMarkers": "Pokaži markere",
+ "reportExport": "Izvoz",
+ "reportEmail": "Izvještaj emailom",
+ "reportSchedule": "Raspored",
+ "reportPeriod": "Period",
+ "reportCustom": "Prilagođeno",
+ "reportToday": "Danas",
+ "reportYesterday": "Jučer",
+ "reportThisWeek": "Ovaj tjedan",
+ "reportPreviousWeek": "Prošli tjedan",
+ "reportThisMonth": "Ovaj mjesec",
+ "reportPreviousMonth": "Prošli mjesec",
+ "reportDeviceName": "Ime uređaja",
+ "reportAverageSpeed": "Prosječna brzina",
+ "reportMaximumSpeed": "Maksimalna brzina",
+ "reportEngineHours": "Sati rada motora",
+ "reportDuration": "Trajanje",
+ "reportStartDate": "Početni datum",
+ "reportStartTime": "Početno vrijeme",
+ "reportStartAddress": "Početna adresa",
+ "reportEndTime": "Vrijeme završetka",
+ "reportEndAddress": "Završna adresa",
+ "reportSpentFuel": "Potrošeno goriva",
+ "reportStartOdometer": "Početna kilometraža",
+ "reportEndOdometer": "Završna kilometraža",
+ "statisticsTitle": "Statistike",
+ "statisticsCaptureTime": "Vrijeme dohvaćanja",
+ "statisticsActiveUsers": "Aktivnih korisnika",
+ "statisticsActiveDevices": "Aktivnih uređaja",
+ "statisticsRequests": "Zahtjeva",
+ "statisticsMessagesReceived": "Poruka primljeno",
+ "statisticsMessagesStored": "Poruka spremljeno",
+ "statisticsGeocoder": "Geocoder zahtjevi",
+ "statisticsGeolocation": "Geolokacijski zahtjevi",
+ "categoryArrow": "Strelica",
+ "categoryDefault": "Zadano",
+ "categoryAnimal": "Životinja",
+ "categoryBicycle": "Bicikl",
+ "categoryBoat": "Brod",
+ "categoryBus": "Autobus",
+ "categoryCar": "Automobil",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Dizalica",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motocikl",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Osoba",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Avion",
+ "categoryShip": "Brod",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Vlak",
+ "categoryTram": "Tramvaj",
+ "categoryTrolleybus": "Trolejbus",
+ "categoryTruck": "Kamion",
+ "categoryVan": "Kombi",
+ "categoryScooter": "Skuter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/hu.json b/legacy/web/l10n/hu.json
new file mode 100644
index 00000000..f50b329c
--- /dev/null
+++ b/legacy/web/l10n/hu.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Betöltés...",
+ "sharedHide": "Elrejt",
+ "sharedSave": "Mentés",
+ "sharedUpload": "Upload",
+ "sharedSet": "Beállít",
+ "sharedCancel": "Mégse",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Hozzáadás",
+ "sharedEdit": "Szerkesztés",
+ "sharedRemove": "Törlés",
+ "sharedRemoveConfirm": "Biztosan törli?",
+ "sharedNoData": "Nincs adat",
+ "sharedSubject": "Subject",
+ "sharedYes": "Igen",
+ "sharedNo": "Nem",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "láb",
+ "sharedKn": "csomó",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Óra",
+ "sharedMinute": "Perc",
+ "sharedSecond": "Másodperc",
+ "sharedDays": "nap",
+ "sharedHours": "óra",
+ "sharedMinutes": "perc",
+ "sharedDecimalDegrees": "Decimális fok",
+ "sharedDegreesDecimalMinutes": "Fok decimális percben",
+ "sharedDegreesMinutesSeconds": "Fok decimális másodpercben",
+ "sharedName": "Név",
+ "sharedDescription": "Leírás",
+ "sharedSearch": "Keresés",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geokerítés",
+ "sharedGeofences": "Geokerítések",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Értesítések",
+ "sharedNotification": "Értesítés",
+ "sharedAttributes": "Tulajdonságok",
+ "sharedAttribute": "Tulajdonság",
+ "sharedDrivers": "Sofőrök",
+ "sharedDriver": "Sofőr",
+ "sharedArea": "Terület",
+ "sharedSound": "Értesítési hang",
+ "sharedType": "Típus",
+ "sharedDistance": "Távolság",
+ "sharedHourAbbreviation": "ó",
+ "sharedMinuteAbbreviation": "p",
+ "sharedSecondAbbreviation": "mp",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gallon",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Angolszász gallon",
+ "sharedUsGallon": "Amerikai Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Térkép állapot lekérés",
+ "sharedComputedAttribute": "Számított attribútum",
+ "sharedComputedAttributes": "Számított attribútumok",
+ "sharedCheckComputedAttribute": "Számított attribútum ellenőrzése",
+ "sharedExpression": "Kifejezés",
+ "sharedDevice": "Eszköz",
+ "sharedTest": "Teszt",
+ "sharedTestNotification": "Próba értesítés küldése",
+ "sharedTestNotificators": "Teszt csatornák",
+ "sharedTestExpression": "Test kifejezés",
+ "sharedCalendar": "Naptár",
+ "sharedCalendars": "Naptárak",
+ "sharedFile": "Fájl",
+ "sharedSearchDevices": "Eszközök keresése",
+ "sharedSortBy": "Rendezés",
+ "sharedFilterMap": "Szűrés a térképen",
+ "sharedSelectFile": "Fájl kiválasztása",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Kötelező",
+ "sharedPreferences": "Preferenciák",
+ "sharedPermissions": "Jogosultságok",
+ "sharedConnections": "Kapcsolatok",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Szöveg",
+ "sharedTypeNumber": "Szám",
+ "sharedTypeBoolean": "Logikai",
+ "sharedTimezone": "Időzóna",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Elmentett parancs",
+ "sharedSavedCommands": "Elmentett Parancsok",
+ "sharedNew": "Új...",
+ "sharedShowAddress": "Cím megjelenítése",
+ "sharedShowDetails": "További részletek",
+ "sharedDisabled": "Letiltva",
+ "sharedMaintenance": "Karbantartás",
+ "sharedDeviceAccumulators": "Akkumulátorok",
+ "sharedAlarms": "Riasztások",
+ "sharedLocation": "Lokáció",
+ "sharedImport": "Importálás",
+ "sharedColumns": "Oszlopok",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Sebesség határ",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Vonaltávolság",
+ "attributeReportIgnoreOdometer": "Jelentés: Odométer figyelmen kívül hagyása",
+ "attributeWebReportColor": "Web: Jelentés színe",
+ "attributeDevicePassword": "Eszköz jelszó",
+ "attributeDeviceImage": "Eszköz kép",
+ "attributeDeviceInactivityStart": "Eszköz inaktivitás kezdete",
+ "attributeDeviceInactivityPeriod": "Eszköz inaktivitás periódus",
+ "attributeProcessingCopyAttributes": "Feldolgozás: Attribútumok másolása",
+ "attributeColor": "Szín",
+ "attributeWebLiveRouteLength": "Web: Élő útvonal hossz",
+ "attributeWebSelectZoom": "Web: közelítés a kiválasztáson",
+ "attributeWebMaxZoom": "Web: Maximális Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "SMTP kiszolgáló",
+ "attributeMailSmtpPort": "SMTP port",
+ "attributeMailSmtpStarttlsEnable": "SMTP STARTTLS engedélyezése",
+ "attributeMailSmtpStarttlsRequired": "SMTP STARTTLS szükséges",
+ "attributeMailSmtpSslEnable": "SMTP SSL engedélyezése",
+ "attributeMailSmtpSslTrust": "SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "SMTP SSL Protokollok",
+ "attributeMailSmtpFrom": "SMTP Feladó",
+ "attributeMailSmtpAuth": "SMTP autentikáció engedélyezése",
+ "attributeMailSmtpUsername": "SMTP felhasználónév",
+ "attributeMailSmtpPassword": "SMTP jelszó",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Csoportok letiltása",
+ "attributeUiDisableEvents": "UI: Események letiltása",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Sofőrök letiltása",
+ "attributeUiDisableComputedAttributes": "UI: Számított attribútumok letiltása",
+ "attributeUiDisableCalendars": "UI: Naptárak letiltása",
+ "attributeUiDisableMaintenance": "UI: Karbantartás letiltása",
+ "attributeUiHidePositionAttributes": "UI: Pozíciós attribútumok elrejtése",
+ "attributeUiDisableLoginLanguage": "UI: Bejelentkezés nyelv letiltás",
+ "attributeNotificationTokens": "Értesítés tokenek",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Hiba",
+ "errorGeneral": "Érvénytelen paraméterek vagy integritási szabályok megsértése",
+ "errorConnection": "Kapcsolódási hiba",
+ "errorSocket": "Kapcsolódási hiba",
+ "errorZero": "Nem lehet nulla",
+ "userEmail": "Email",
+ "userPassword": "Jelszó",
+ "userAdmin": "Adminisztrátor",
+ "userRemember": "Megjegyez",
+ "userExpirationTime": "Lejárat",
+ "userDeviceLimit": "Eszköz limit",
+ "userUserLimit": "Felhasználólimit",
+ "userDeviceReadonly": "Eszköz csak olvasható",
+ "userLimitCommands": "Parancsok listázása",
+ "userDisableReports": "Riportok letiltása",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Bejelentkezés",
+ "loginLanguage": "Nyelv",
+ "loginReset": "Jelszó reset",
+ "loginRegister": "Regisztráció",
+ "loginLogin": "Bejelentkezés",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Hibás email vagy jelszó",
+ "loginCreated": "Az új felhasználó sikeresen létrehozva",
+ "loginResetSuccess": "Ellenőrizd az emailedet",
+ "loginUpdateSuccess": "Új jelszó beállítva",
+ "loginLogout": "Kilépés",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Eszközök és állapotuk",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Eszközök",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Azonosító",
+ "deviceModel": "Modell",
+ "deviceContact": "Kapcsolat",
+ "deviceCategory": "Kategória",
+ "deviceLastUpdate": "Utolsó frissítés",
+ "deviceCommand": "Parancs",
+ "deviceFollow": "Követ",
+ "deviceTotalDistance": "Teljes távolság",
+ "deviceStatus": "Státusz",
+ "deviceStatusOnline": "Elérhető",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Ismeretlen",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Csoport",
+ "groupParent": "Csoport",
+ "groupNoGroup": "Nincs Csoport",
+ "settingsTitle": "Beállítások",
+ "settingsUser": "Fiók",
+ "settingsGroups": "Csoportok",
+ "settingsServer": "Szerver",
+ "settingsUsers": "Felhasználók",
+ "settingsDistanceUnit": "Távolság egysége",
+ "settingsAltitudeUnit": "Magasság mértékegység",
+ "settingsSpeedUnit": "Sebesség egysége",
+ "settingsVolumeUnit": "Térfogat egysége",
+ "settingsTwelveHourFormat": "12-órás formátum",
+ "settingsCoordinateFormat": "Koordináta formátuma",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Jelentések",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Eszköz",
+ "reportGroup": "Csoport",
+ "reportFrom": "Kezdő dátum:",
+ "reportTo": "Végső dátum:",
+ "reportShow": "Mutat",
+ "reportClear": "Töröl",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Idő beállítás",
+ "positionDeviceTime": "Eszköz idő",
+ "positionServerTime": "Szerver idő",
+ "positionValid": "Valós",
+ "positionAccuracy": "Pontosság",
+ "positionLatitude": "Szélességi fok",
+ "positionLongitude": "Hosszúsági fok",
+ "positionAltitude": "Magasság",
+ "positionSpeed": "Sebesség",
+ "positionCourse": "Irány",
+ "positionAddress": "Cím",
+ "positionProtocol": "Protokoll",
+ "positionDistance": "Távolság",
+ "positionRpm": "Fordulat",
+ "positionFuel": "Üzemanyag",
+ "positionPower": "Áramforrás",
+ "positionBattery": "Akkumulátor",
+ "positionRaw": "Nyers",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Műholdak",
+ "positionSatVisible": "Látható műholdak",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Esemény",
+ "positionAlarm": "Riasztás",
+ "positionStatus": "Státusz",
+ "positionOdometer": "Megtett út",
+ "positionServiceOdometer": "Szerviz megtett út",
+ "positionTripOdometer": "Utazás megtett út",
+ "positionHours": "Órák",
+ "positionSteps": "Lépések",
+ "positionInput": "Bemenet",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Kimenet",
+ "positionBatteryLevel": "Akkumulátor szint",
+ "positionFuelConsumption": "Fogyasztás",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware verzió",
+ "positionVersionHw": "Hardver verzió",
+ "positionIgnition": "Gyújtás",
+ "positionFlags": "Zászlók",
+ "positionCharge": "Töltés",
+ "positionIp": "IP",
+ "positionArchive": "Arhív",
+ "positionVin": "Alvázszám",
+ "positionApproximate": "Megközelít",
+ "positionThrottle": "Gázkar",
+ "positionMotion": "Mozgás",
+ "positionArmed": "Élesített",
+ "positionAcceleration": "Gyorsulás",
+ "positionTemp": "Hőmérséklet",
+ "positionDeviceTemp": "Eszköz hőmérséklet",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operátor",
+ "positionCommand": "Parancs",
+ "positionBlocked": "Blokkolt",
+ "positionDtcs": "DTCk",
+ "positionObdSpeed": "ODB sebesség",
+ "positionObdOdometer": "ODB megtett út",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Sofőr egyedi azonosítója",
+ "positionCard": "Card",
+ "positionImage": "Kép",
+ "positionVideo": "Video",
+ "positionAudio": "Hang",
+ "serverTitle": "Szerver beállítások",
+ "serverZoom": "Nagyítás",
+ "serverRegistration": "Regisztráció",
+ "serverReadonly": "Csak olvasható",
+ "serverForceSettings": "Erő beállítások",
+ "serverAnnouncement": "Bejelentés",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Térkép",
+ "mapActive": "Aktív térképek",
+ "mapOverlay": "Térkép réteg",
+ "mapOverlayCustom": "Egyedi réteg",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Felhőtérkép",
+ "mapOpenWeatherPrecipitation": "OpenWeather Csapadéktérkép",
+ "mapOpenWeatherPressure": "OpenWeather Nyomás",
+ "mapOpenWeatherWind": "OpenWeather Széltérkép",
+ "mapOpenWeatherTemperature": "OpenWeather Hőtérkép",
+ "mapLayer": "Térkép réteg",
+ "mapCustom": "Egyedi (XYZ)",
+ "mapCustomArcgis": "Egyedi (ArcGIS)",
+ "mapCustomLabel": "Egyedi térkép",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps kulcs",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex térkép",
+ "mapYandexSat": "Yandex Műhold",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Rendelkezésre állási felmérés",
+ "mapMapboxStreets": "Mapbox utca",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox kültéri",
+ "mapMapboxSatellite": "Mapbox műhold",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Alap",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Alap",
+ "mapTomTomFlow": "TomTom Forgalom",
+ "mapTomTomIncidents": "TomTom Balesetek",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Alap",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Műhold",
+ "mapHereFlow": "Here Forgalom",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Poligon",
+ "mapShapeCircle": "Kör",
+ "mapShapePolyline": "Vonallánc",
+ "mapLiveRoutes": "Élő útvonalak",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Jelenlegi pozíció",
+ "mapPoiLayer": "POI réteg",
+ "mapClustering": "Jelölő csoportosítás",
+ "mapOnSelect": "Térkép mutatása a kijelölésen",
+ "mapDefault": "Default Map",
+ "stateTitle": "Helyzet",
+ "stateName": "Paraméter",
+ "stateValue": "Érték",
+ "commandTitle": "Parancs",
+ "commandSend": "Küld",
+ "commandSent": "Parancs elküldve",
+ "commandQueued": "Parancs várakozik",
+ "commandUnit": "Egység",
+ "commandCustom": "Egyedi parancs",
+ "commandDeviceIdentification": "Eszköz azonosító",
+ "commandPositionSingle": "Egyszeri jelentés",
+ "commandPositionPeriodic": "Pozició küldés",
+ "commandPositionStop": "Pozició küldés vége",
+ "commandEngineStop": "Motor letiltás",
+ "commandEngineResume": "Motor engedélyezés",
+ "commandAlarmArm": "Riasztó élesítés",
+ "commandAlarmDisarm": "Riasztó kikapcsolás",
+ "commandAlarmDismiss": "Riasztás némítása",
+ "commandSetTimezone": "Időzóna beállítás",
+ "commandRequestPhoto": "Kép lekérés",
+ "commandPowerOff": "Készülék kikapcsolás",
+ "commandRebootDevice": "Eszköz újraindítása",
+ "commandFactoryReset": "Gyári visszaállítás",
+ "commandSendSms": "SMS küldés",
+ "commandSendUssd": "USSD küldés",
+ "commandSosNumber": "SOS szám beállítás",
+ "commandSilenceTime": "Csendes idő beállítás",
+ "commandSetPhonebook": "Telefonkönyv beállítás",
+ "commandVoiceMessage": "Hangüzenet",
+ "commandOutputControl": "Kimenet Ellenőrzés",
+ "commandVoiceMonitoring": "Hangfelügyelet",
+ "commandSetAgps": "AGPS beállítása",
+ "commandSetIndicator": "Jelölő beállítása",
+ "commandConfiguration": "Konfiguráció",
+ "commandGetVersion": "Verzió beszerzése",
+ "commandFirmwareUpdate": "Firmware frissítése",
+ "commandSetConnection": "Kapcsolat beállítása",
+ "commandSetOdometer": "Távolságmérés beállítása",
+ "commandGetModemStatus": "Modem állapotának lekérdezése",
+ "commandGetDeviceStatus": "Eszköz állapotának lekérdezése",
+ "commandSetSpeedLimit": "Sebességhatár beállítása",
+ "commandModePowerSaving": "Energiatakarékos mód",
+ "commandModeDeepSleep": "Mélyalvás mód",
+ "commandAlarmGeofence": "Zóna riasztás beállítás",
+ "commandAlarmBattery": "Akkumulátor riasztás beállítás",
+ "commandAlarmSos": "SOS riasztás beállítása",
+ "commandAlarmRemove": "Eltávolítás riasztás beállítása",
+ "commandAlarmClock": "Óra riasztás beállítása",
+ "commandAlarmSpeed": "Sebesség riasztás beállítása",
+ "commandAlarmFall": "Leesés riasztás beállítása",
+ "commandAlarmVibration": "Rezgés riasztás beállítása",
+ "commandFrequency": "Frekvencia",
+ "commandTimezone": "Időzóna eltoása",
+ "commandMessage": "Üzenet",
+ "commandRadius": "Sugár",
+ "commandEnable": "Engedélyez",
+ "commandData": "Adat",
+ "commandIndex": "Index",
+ "commandPhone": "Telefonszám",
+ "commandServer": "Szerver",
+ "commandPort": "Port",
+ "eventAll": "Minden esemény",
+ "eventDeviceOnline": "Státusz online",
+ "eventDeviceUnknown": "Státusz ismeretlen",
+ "eventDeviceOffline": "Státusz offline",
+ "eventDeviceInactive": "Eszköz inaktív",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Eszköz mozgásban",
+ "eventDeviceStopped": "Eszköz megállt",
+ "eventDeviceOverspeed": "Sebességhatár túllépés",
+ "eventDeviceFuelDrop": "Üzemanyag vesztés",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Parancs eredmény",
+ "eventGeofenceEnter": "Beléptett a területbe",
+ "eventGeofenceExit": "Kilépett a területből",
+ "eventAlarm": "Riasztás",
+ "eventIgnitionOn": "Gyújtás be",
+ "eventIgnitionOff": "Gyújtás ki",
+ "eventMaintenance": "Karbantartás szükséges",
+ "eventTextMessage": "Szöveges üzenet érkezett",
+ "eventDriverChanged": "Vezető váltás",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Utolsóhoz ugrás",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Általános",
+ "alarmSos": "SOS",
+ "alarmVibration": "Rezgés",
+ "alarmMovement": "Mozgás",
+ "alarmLowspeed": "Alacsony sebesség",
+ "alarmOverspeed": "Gyorshajtás",
+ "alarmFallDown": "Leesett",
+ "alarmLowPower": "Alacsony feszültség",
+ "alarmLowBattery": "Alacsony töltöttség",
+ "alarmFault": "Meghibásodás",
+ "alarmPowerOff": "Kikapcsolva",
+ "alarmPowerOn": "Bekapcsolva",
+ "alarmDoor": "Ajtó",
+ "alarmLock": "Zárás",
+ "alarmUnlock": "Nyitás",
+ "alarmGeofence": "Terület",
+ "alarmGeofenceEnter": "Belépés a területre",
+ "alarmGeofenceExit": "Kilépés a területről",
+ "alarmGpsAntennaCut": "GPS jelvesztés",
+ "alarmAccident": "Baleset",
+ "alarmTow": "Vontatás",
+ "alarmIdle": "Tétlen",
+ "alarmHighRpm": "Magas fordulatszám",
+ "alarmHardAcceleration": "Erős gyorsítás",
+ "alarmHardBraking": "Erős fékezés",
+ "alarmHardCornering": "Hirtelen kanyarodás",
+ "alarmLaneChange": "Sávváltás",
+ "alarmFatigueDriving": "Veszélyes vezetés",
+ "alarmPowerCut": "Áramvesztés",
+ "alarmPowerRestored": "Áram helyreállítva",
+ "alarmJamming": "Zavarás",
+ "alarmTemperature": "Hőmérséklet",
+ "alarmParking": "Parkolás",
+ "alarmBonnet": "Motorház",
+ "alarmFootBrake": "Fék",
+ "alarmFuelLeak": "Üzemanyag szivárgás",
+ "alarmTampering": "Manipulálás",
+ "alarmRemoving": "Eltávolítás",
+ "notificationType": "Értesítés Típusa",
+ "notificationAlways": "Minden eszköz",
+ "notificationNotificators": "Csatornák",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Levelezés",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Tűzoltóság",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Visszajátszás",
+ "reportCombined": "Combined",
+ "reportRoute": "Útvonal",
+ "reportEvents": "Események",
+ "reportTrips": "Utazások",
+ "reportStops": "Megállók",
+ "reportSummary": "Összegzés",
+ "reportDaily": "Napi összesítés",
+ "reportChart": "Diagram",
+ "reportConfigure": "Konfiguráció",
+ "reportEventTypes": "Esemény típusok",
+ "reportChartType": "Diagram típusa",
+ "reportShowMarkers": "Jelölők megjelenítése",
+ "reportExport": "Exportálás",
+ "reportEmail": "Email Riport",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Periódus",
+ "reportCustom": "Egyéni",
+ "reportToday": "Ma",
+ "reportYesterday": "Tegnap",
+ "reportThisWeek": "Ez a hét",
+ "reportPreviousWeek": "Előző hét",
+ "reportThisMonth": "Ez a hónap",
+ "reportPreviousMonth": "Előző hónap",
+ "reportDeviceName": "Eszköz neve",
+ "reportAverageSpeed": "Átlagos sebesség",
+ "reportMaximumSpeed": "Maximális sebesség",
+ "reportEngineHours": "Motorjárat órák",
+ "reportDuration": "Időtartam",
+ "reportStartDate": "Kezdés dátuma",
+ "reportStartTime": "Indulás ideje",
+ "reportStartAddress": "Induló címe",
+ "reportEndTime": "Megérkezés ideje",
+ "reportEndAddress": "Megérkezés címe",
+ "reportSpentFuel": "Elhasznált üzemanyag",
+ "reportStartOdometer": "Kilométer start",
+ "reportEndOdometer": "Kilométer Vég",
+ "statisticsTitle": "Statisztika",
+ "statisticsCaptureTime": "Rögzítés ideje",
+ "statisticsActiveUsers": "Aktív felhasználók",
+ "statisticsActiveDevices": "Aktív eszközök",
+ "statisticsRequests": "Kérések",
+ "statisticsMessagesReceived": "Fogadott üzenetek",
+ "statisticsMessagesStored": "Tárolt üzenetek",
+ "statisticsGeocoder": "Geocoder kérések",
+ "statisticsGeolocation": "Geopozíció kérések",
+ "categoryArrow": "Nyíl",
+ "categoryDefault": "Alapértelmezett",
+ "categoryAnimal": "Állat",
+ "categoryBicycle": "Bicikli",
+ "categoryBoat": "Csónak",
+ "categoryBus": "Busz",
+ "categoryCar": "Autó",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Daru",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motorbicikli",
+ "categoryOffroad": "Terep",
+ "categoryPerson": "Személy",
+ "categoryPickup": "Platós",
+ "categoryPlane": "Repülő",
+ "categoryShip": "Hajó",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Vonat",
+ "categoryTram": "Villamos",
+ "categoryTrolleybus": "Trolibusz",
+ "categoryTruck": "Kamion",
+ "categoryVan": "Teherkocsi",
+ "categoryScooter": "Roller",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Periódus"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/id.json b/legacy/web/l10n/id.json
new file mode 100644
index 00000000..c7883dae
--- /dev/null
+++ b/legacy/web/l10n/id.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Memuat...",
+ "sharedHide": "Sembunyikan",
+ "sharedSave": "Simpan",
+ "sharedUpload": "Upload",
+ "sharedSet": "Setel",
+ "sharedCancel": "Batal",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Tambah",
+ "sharedEdit": "Ubah",
+ "sharedRemove": "Hapus",
+ "sharedRemoveConfirm": "Hapus Item?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mp/h",
+ "sharedHour": "Jam",
+ "sharedMinute": "Menit",
+ "sharedSecond": "Detik",
+ "sharedDays": "Hari",
+ "sharedHours": "Jam",
+ "sharedMinutes": "Menit",
+ "sharedDecimalDegrees": "Derajat Desimal",
+ "sharedDegreesDecimalMinutes": "Menit Derajat Desimal",
+ "sharedDegreesMinutesSeconds": "Menit Detik Derajat",
+ "sharedName": "Nama",
+ "sharedDescription": "Deskripsi",
+ "sharedSearch": "Cari",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Batas Wilayah",
+ "sharedGeofences": "Semua Batas Wilayah",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Notifikasi",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "Semua Atribut",
+ "sharedAttribute": "Atribut",
+ "sharedDrivers": "Antarmuka",
+ "sharedDriver": "Antarmuka",
+ "sharedArea": "Area",
+ "sharedSound": "Notifikasi Suara",
+ "sharedType": "Tipe",
+ "sharedDistance": "Jarak",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Dapatkan Status Peta",
+ "sharedComputedAttribute": "Atribut Terkomputerisasi",
+ "sharedComputedAttributes": "Semua Atribut Terkomputerisasi",
+ "sharedCheckComputedAttribute": "Pilih Atribut Terkomputerisasi",
+ "sharedExpression": "Ekspresi",
+ "sharedDevice": "Perangkat",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Kirim Test Notifikasi",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Kalender",
+ "sharedCalendars": "Semua Kalender",
+ "sharedFile": "Berkas",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Pilih Berkas",
+ "sharedPhone": "Telepon",
+ "sharedRequired": "Diperlukan",
+ "sharedPreferences": "Preferensi",
+ "sharedPermissions": "Kewenangan",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Ekstra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Nomor",
+ "sharedTypeBoolean": "Pilihan",
+ "sharedTimezone": "Zona Waktu",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Perintah Tersimpan",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "Baru...",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Batas Kecepatan",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Laporan: Biarkan Odometer",
+ "attributeWebReportColor": "Web: Warna Laporan",
+ "attributeDevicePassword": "Sandi Perangkat",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Memproses: Salin Semua Atribut",
+ "attributeColor": "Warna",
+ "attributeWebLiveRouteLength": "Web: Panjang Rute Aktif",
+ "attributeWebSelectZoom": "Web: Perbesar Saat Pilih",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS Aktif",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS Diperlukan",
+ "attributeMailSmtpSslEnable": "Mail: SMTP SSL Aktif",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL Terpercaya",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL Protokol",
+ "attributeMailSmtpFrom": "Mail: SMTP Pengirim",
+ "attributeMailSmtpAuth": "Mail: SMTP Otorisasi Aktif",
+ "attributeMailSmtpUsername": "Mail: SMTP Pengguna",
+ "attributeMailSmtpPassword": "Mail: SMTP Sandi",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI : Nonaktifkan Antarmuka",
+ "attributeUiDisableComputedAttributes": "UI : Nonaktifkan Computed Attributes",
+ "attributeUiDisableCalendars": "UI : Nonaktifkan Kalender",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Bermasalah",
+ "errorGeneral": "Semua Parameter Salah Atau Salah Aturan",
+ "errorConnection": "Koneksi Bermasalah",
+ "errorSocket": "Koneksi Web Socket Bermasalah",
+ "errorZero": "Can't be zero",
+ "userEmail": "Email",
+ "userPassword": "Sandi",
+ "userAdmin": "Admin",
+ "userRemember": "Diingat",
+ "userExpirationTime": "Kadaluarsa",
+ "userDeviceLimit": "Batas Perangkat",
+ "userUserLimit": "Batas Pengguna",
+ "userDeviceReadonly": "Perangkat Hanya Dilihat",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Masuk",
+ "loginLanguage": "Bahasa",
+ "loginReset": "Reset Password",
+ "loginRegister": "Daftar",
+ "loginLogin": "Masuk",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Email Atau Password Salah",
+ "loginCreated": "Pengguna Baru Telah Terdaftar",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Keluar",
+ "loginLogo": "Lambang",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Perangkat Dan Status",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Semua Perangkat",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Pengindetifikasi",
+ "deviceModel": "Model",
+ "deviceContact": "Kontak",
+ "deviceCategory": "Kategori",
+ "deviceLastUpdate": "Terbaru",
+ "deviceCommand": "Perintah",
+ "deviceFollow": "Ikuti",
+ "deviceTotalDistance": "Total Jarak",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Aktif",
+ "deviceStatusOffline": "Tidak Aktif",
+ "deviceStatusUnknown": "Tidak Diketahui",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Grup",
+ "groupParent": "Grup",
+ "groupNoGroup": "No Grup",
+ "settingsTitle": "Pengaturan",
+ "settingsUser": "Akun",
+ "settingsGroups": "Semua Grup",
+ "settingsServer": "Server",
+ "settingsUsers": "Pengguna",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "Format 12 Jam",
+ "settingsCoordinateFormat": "Format Koordinat",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Semua Laporan",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Perangkat",
+ "reportGroup": "Grup",
+ "reportFrom": "Dari",
+ "reportTo": "Ke",
+ "reportShow": "Tampilkan",
+ "reportClear": "Bersihkan",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Validitas",
+ "positionAccuracy": "Akurasi",
+ "positionLatitude": "Lintang",
+ "positionLongitude": "Bujur",
+ "positionAltitude": "Ketinggian",
+ "positionSpeed": "Kecepatan",
+ "positionCourse": "Arah",
+ "positionAddress": "Alamat",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Jarak",
+ "positionRpm": "RPM",
+ "positionFuel": "BBM",
+ "positionPower": "Tenaga",
+ "positionBattery": "Baterai",
+ "positionRaw": "Mentah",
+ "positionIndex": "Indek",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Peristiwa",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Odometer Perbaikan",
+ "positionTripOdometer": "Odometer Perjalanan",
+ "positionHours": "Semua Jam",
+ "positionSteps": "Steps",
+ "positionInput": "Masukan",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Keluaran",
+ "positionBatteryLevel": "Level Battery",
+ "positionFuelConsumption": "Konsumsi BBM",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Versi Firmware",
+ "positionVersionHw": "Versi Hardware",
+ "positionIgnition": "Mesin",
+ "positionFlags": "Semua Bendera",
+ "positionCharge": "Pengisian",
+ "positionIp": "IP",
+ "positionArchive": "Arsip",
+ "positionVin": "VIN",
+ "positionApproximate": "Perkiraan",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Gerakan",
+ "positionArmed": "Aktif",
+ "positionAcceleration": "Akselerasi",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Suhu Perangkat",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Perintah",
+ "positionBlocked": "Diblok",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Kecepatan OBD",
+ "positionObdOdometer": "Odometer OBD",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "ID Unik Antarmuka",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Semua Pengaturan Server",
+ "serverZoom": "Perbesar",
+ "serverRegistration": "Pendaftaran",
+ "serverReadonly": "Hanya Dilihat",
+ "serverForceSettings": "Semua Pengaturan Paksa",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Peta",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Layer Peta",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Peta Carto",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Key Peta Bing",
+ "mapBingRoad": "Peta Jalan Bing",
+ "mapBingAerial": "Peta Udara Bing",
+ "mapBingHybrid": "Peta Bing Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Peta Yandex",
+ "mapYandexSat": "Satelit Yandex",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Poligon",
+ "mapShapeCircle": "Lingkaran",
+ "mapShapePolyline": "Garis Poli",
+ "mapLiveRoutes": "Rute Aktif",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Status",
+ "stateName": "Atribut",
+ "stateValue": "Nilai",
+ "commandTitle": "Perintah",
+ "commandSend": "Kirim",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "Unit",
+ "commandCustom": "Perintah Buatan",
+ "commandDeviceIdentification": "Identifikasi Perangkat",
+ "commandPositionSingle": "Laporan Tunggal",
+ "commandPositionPeriodic": "Laporan Berkala",
+ "commandPositionStop": "Stop Laporan",
+ "commandEngineStop": "Matikan Mesin",
+ "commandEngineResume": "HIdupkan Mesin",
+ "commandAlarmArm": "Alarm Aktif",
+ "commandAlarmDisarm": "Alarm Tidak Aktif",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Setel Zona Waktu",
+ "commandRequestPhoto": "Permintaan Foto",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Hidupkan Ulang Perangkat",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Kirim SMS",
+ "commandSendUssd": "Kirim USSD",
+ "commandSosNumber": "Kirim Nomor Darurat",
+ "commandSilenceTime": "Setel Waktu DIam",
+ "commandSetPhonebook": "Setel Buku Telepon",
+ "commandVoiceMessage": "Pesan Suara",
+ "commandOutputControl": "Kontrol Output",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Setel Indikasi",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekuensi",
+ "commandTimezone": "Zona Waktu Tidak Tepat",
+ "commandMessage": "Pesan",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Data",
+ "commandIndex": "Indeks",
+ "commandPhone": "Nomor Telepon",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Semua Peristiwa",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Hasil Perintah",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Perlu Perbaikan",
+ "eventTextMessage": "Pesan Teks Diterima",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Bergulir Ke Terakhir",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Tipe Notifikasi",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Rute",
+ "reportEvents": "Semua Peristiwa",
+ "reportTrips": "Perjalanan",
+ "reportStops": "Berhenti",
+ "reportSummary": "Ringkasan",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Grafik",
+ "reportConfigure": "Pengaturan",
+ "reportEventTypes": "Tipe Peristiwa",
+ "reportChartType": "Tipe Grafik",
+ "reportShowMarkers": "Tampilkan Tanda",
+ "reportExport": "Ekspor",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "Nama Perangkat",
+ "reportAverageSpeed": "Kecepatan Rata-rata",
+ "reportMaximumSpeed": "Kecepatan Tertinggi",
+ "reportEngineHours": "Durasi Mesin",
+ "reportDuration": "Durasi",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Waktu Awal",
+ "reportStartAddress": "Alamat Awal",
+ "reportEndTime": "Waktu Akhir",
+ "reportEndAddress": "Alamat Akhir",
+ "reportSpentFuel": "BBM Terpakai",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Statistik",
+ "statisticsCaptureTime": "Waktu Didapat",
+ "statisticsActiveUsers": "Pengguna Aktif",
+ "statisticsActiveDevices": "Perangkat Aktif",
+ "statisticsRequests": "Permintaan",
+ "statisticsMessagesReceived": "Pesan Diterima",
+ "statisticsMessagesStored": "Pesan Disimpan",
+ "statisticsGeocoder": "Permintaan Geocoder",
+ "statisticsGeolocation": "Permintaan Geolokasi",
+ "categoryArrow": "Panah",
+ "categoryDefault": "Pengaturan Awal",
+ "categoryAnimal": "Hewan",
+ "categoryBicycle": "Sepeda",
+ "categoryBoat": "Perahu",
+ "categoryBus": "Bis",
+ "categoryCar": "Mobil",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Sepeda Motor",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Orang",
+ "categoryPickup": "Jemput",
+ "categoryPlane": "Pesawat",
+ "categoryShip": "Kapal Laut",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Truk",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/it.json b/legacy/web/l10n/it.json
new file mode 100644
index 00000000..03fcbb16
--- /dev/null
+++ b/legacy/web/l10n/it.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Caricamento...",
+ "sharedHide": "Nascondi",
+ "sharedSave": "Salva",
+ "sharedUpload": "Carica",
+ "sharedSet": "Imposta",
+ "sharedCancel": "Annulla",
+ "sharedCopy": "Copia",
+ "sharedAdd": "Aggiungi",
+ "sharedEdit": "Modifica",
+ "sharedRemove": "Rimuovi",
+ "sharedRemoveConfirm": "Rimuovere elemento?",
+ "sharedNoData": "Nessun dato",
+ "sharedSubject": "Soggetto",
+ "sharedYes": "Si",
+ "sharedNo": "No",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Ora",
+ "sharedMinute": "Minuto",
+ "sharedSecond": "Secondo",
+ "sharedDays": "giorni",
+ "sharedHours": "ore",
+ "sharedMinutes": "minuti",
+ "sharedDecimalDegrees": "Gradi",
+ "sharedDegreesDecimalMinutes": "Gradi Minuti",
+ "sharedDegreesMinutesSeconds": "Gradi Minuti Secondi",
+ "sharedName": "Nome",
+ "sharedDescription": "Descrizione",
+ "sharedSearch": "Cerca",
+ "sharedIconScale": "Grandezza Icona",
+ "sharedGeofence": "Geo Area",
+ "sharedGeofences": "Geo Aree",
+ "sharedCreateGeofence": "Crea Geo Area",
+ "sharedNotifications": "Notifiche",
+ "sharedNotification": "Notifica",
+ "sharedAttributes": "Attributi",
+ "sharedAttribute": "Attributo",
+ "sharedDrivers": "Autisti",
+ "sharedDriver": "Autista",
+ "sharedArea": "Area",
+ "sharedSound": "Suono Notifica",
+ "sharedType": "Tipo",
+ "sharedDistance": "Distanza",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Litri",
+ "sharedImpGallon": "Galloni Imperiali",
+ "sharedUsGallon": "Galloni USA",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Ottieni Stato Mappa",
+ "sharedComputedAttribute": "Attributo Calcolato",
+ "sharedComputedAttributes": "Attributi Calcolati",
+ "sharedCheckComputedAttribute": "Controlla Attributo Calcolato",
+ "sharedExpression": "Espressione",
+ "sharedDevice": "Dispositivo",
+ "sharedTest": "Prova",
+ "sharedTestNotification": "Invia Notifica di Prova",
+ "sharedTestNotificators": "Prova Canali",
+ "sharedTestExpression": "Prova Espressione",
+ "sharedCalendar": "Calendario",
+ "sharedCalendars": "Calendari",
+ "sharedFile": "File",
+ "sharedSearchDevices": "Cerca Dispositivi",
+ "sharedSortBy": "Ordina per",
+ "sharedFilterMap": "Filtra su Mappa",
+ "sharedSelectFile": "Seleziona file",
+ "sharedPhone": "Telefono",
+ "sharedRequired": "Richiesto",
+ "sharedPreferences": "Preferenze",
+ "sharedPermissions": "Permessi",
+ "sharedConnections": "Connessioni",
+ "sharedExtra": "Informazioni Aggiuntive",
+ "sharedPrimary": "Primario",
+ "sharedSecondary": "Secondario",
+ "sharedTypeString": "Stringa",
+ "sharedTypeNumber": "Numero",
+ "sharedTypeBoolean": "Booleano",
+ "sharedTimezone": "Fuso Orario",
+ "sharedInfoTitle": "Informazioni",
+ "sharedSavedCommand": "Comando Salvato",
+ "sharedSavedCommands": "Comandi Salvati",
+ "sharedNew": "Nuovo…",
+ "sharedShowAddress": "Mostra Indirizzo",
+ "sharedShowDetails": "Dettagli Aggiuntivi",
+ "sharedDisabled": "Disattivato",
+ "sharedMaintenance": "Manutenzione",
+ "sharedDeviceAccumulators": "Accumulatori",
+ "sharedAlarms": "Allarmi",
+ "sharedLocation": "Posizione",
+ "sharedImport": "Importa",
+ "sharedColumns": "Colonne",
+ "sharedDropzoneText": "Trascina un file qui o clicca",
+ "sharedLogs": "Registri",
+ "sharedLink": "Collegamento",
+ "calendarSimple": "Semplice",
+ "calendarRecurrence": "Ricorrente",
+ "calendarOnce": "Una volta",
+ "calendarDaily": "Giornaliero",
+ "calendarWeekly": "Settimanale",
+ "calendarMonthly": "Mensile",
+ "calendarDays": "Giorni",
+ "calendarSunday": "Domenica",
+ "calendarMonday": "Lunedì",
+ "calendarTuesday": "Martedì",
+ "calendarWednesday": "Mercoledì",
+ "calendarThursday": "Giovedì",
+ "calendarFriday": "Venerdì",
+ "calendarSaturday": "Sabato",
+ "attributeShowGeofences": "Mostra Geo Aree",
+ "attributeSpeedLimit": "Limite Di Velocità",
+ "attributeFuelDropThreshold": "Soglia di calo carburante",
+ "attributeFuelIncreaseThreshold": "Soglia di aumento carburante",
+ "attributePolylineDistance": "Distanza Polilinea",
+ "attributeReportIgnoreOdometer": "Rapporto: Ignora Odometro",
+ "attributeWebReportColor": "Web: Colore Rapporto",
+ "attributeDevicePassword": "Password Dispositivo",
+ "attributeDeviceImage": "Immagine dispositivo",
+ "attributeDeviceInactivityStart": "Inizio Inattività Dispositivo",
+ "attributeDeviceInactivityPeriod": "Periodo Inattività Dispositivo",
+ "attributeProcessingCopyAttributes": "Elaborazione: Copia Attributi",
+ "attributeColor": "Colore",
+ "attributeWebLiveRouteLength": "Web: Lunghezza Percorso in Diretta",
+ "attributeWebSelectZoom": "Web: Ingrandimento su Selezione",
+ "attributeWebMaxZoom": "Web: Ingrandimento Massimo",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover Chiave Utente",
+ "attributePushoverDeviceNames": "Pushover Nome Dispositivo",
+ "attributeMailSmtpHost": "Mail: Host SMTP",
+ "attributeMailSmtpPort": "Mail: Porta SMTP",
+ "attributeMailSmtpStarttlsEnable": "Mail: Attiva STARTTLS SMTP",
+ "attributeMailSmtpStarttlsRequired": "Mail: Richiesto STARTTLS SMTP",
+ "attributeMailSmtpSslEnable": "Mail: Attiva SSL SMTP",
+ "attributeMailSmtpSslTrust": "Mail: Fiducia SSL SMTP",
+ "attributeMailSmtpSslProtocols": "Mail: Protocolli SSL SMTP",
+ "attributeMailSmtpFrom": "Mail: SMTP Da",
+ "attributeMailSmtpAuth": "Mail: Attiva Autenticazione SMTP",
+ "attributeMailSmtpUsername": "Mail: Nome Utente SMTP",
+ "attributeMailSmtpPassword": "Mail: Password SMTP",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disattiva Attributi",
+ "attributeUiDisableGroups": "UI: Disattiva Gruppi",
+ "attributeUiDisableEvents": "UI: Disattiva Eventi",
+ "attributeUiDisableVehicleFeatures": "UI: disabilita le funzionalità del veicolo",
+ "attributeUiDisableDrivers": "UI: Disattiva Autisti",
+ "attributeUiDisableComputedAttributes": "UI: Disattiva Attributi Calcolati",
+ "attributeUiDisableCalendars": "UI: Disattiva Calendari",
+ "attributeUiDisableMaintenance": "UI: Disattiva Manutenzione",
+ "attributeUiHidePositionAttributes": "UI: Nascondi Attributi Posizione",
+ "attributeUiDisableLoginLanguage": "UI: Disabilita lingua di accesso",
+ "attributeNotificationTokens": "Token di Notifica",
+ "attributePopupInfo": "Informazioni Popup",
+ "errorTitle": "Errore",
+ "errorGeneral": "Parametri non validi o violazione dei vincoli",
+ "errorConnection": "Errore di connessione",
+ "errorSocket": "Errore connessione Web socket",
+ "errorZero": "Non può essere zero",
+ "userEmail": "Email",
+ "userPassword": "Password",
+ "userAdmin": "Amministratore",
+ "userRemember": "Ricorda",
+ "userExpirationTime": "Scadenza",
+ "userDeviceLimit": "Limite Dispositivo",
+ "userUserLimit": "Limite Utente",
+ "userDeviceReadonly": "Dispositivo in Sola Lettura",
+ "userLimitCommands": "Limita Comandi",
+ "userDisableReports": "Disattiva Rapporti",
+ "userFixedEmail": "Nessuna modifica Email",
+ "userToken": "Token",
+ "userDeleteAccount": "Elimina Account",
+ "userTemporary": "Temporaneo",
+ "loginTitle": "Accesso",
+ "loginLanguage": "Lingua",
+ "loginReset": "Resetta Password",
+ "loginRegister": "Registrazione",
+ "loginLogin": "Accesso",
+ "loginOpenId": "Accesso con OpenID",
+ "loginFailed": "Indirizzo email o password errati",
+ "loginCreated": "Un nuovo utente si è registrato",
+ "loginResetSuccess": "Controlla la tua email",
+ "loginUpdateSuccess": "Nuova password impostata",
+ "loginLogout": "Esci",
+ "loginLogo": "Logo",
+ "loginTotpCode": "Codice Password Monouso",
+ "loginTotpKey": "Chiave Password Monouso",
+ "devicesAndState": "Dispositivi e Stato",
+ "deviceSelected": "Dispositivo selezionato",
+ "deviceTitle": "Dispositivi",
+ "devicePrimaryInfo": "Titolo dispositivo",
+ "deviceSecondaryInfo": "Dettagli dispositivo",
+ "deviceIdentifier": "Identificativo",
+ "deviceModel": "Modello",
+ "deviceContact": "Contatto",
+ "deviceCategory": "Categoria",
+ "deviceLastUpdate": "Ultimo Aggiornamento",
+ "deviceCommand": "Comando",
+ "deviceFollow": "Segui",
+ "deviceTotalDistance": "Distanza Totale",
+ "deviceStatus": "Stato",
+ "deviceStatusOnline": "Connesso",
+ "deviceStatusOffline": "Disconnesso",
+ "deviceStatusUnknown": "Sconosciuto",
+ "deviceRegisterFirst": "Registra il tuo primo dispositivo",
+ "deviceIdentifierHelp": "IMEI, numero di serie o altro ID. Deve corrispondere ai rapporti del dispositivo identificatore sul server.",
+ "deviceShare": "Condividi Dispositivo",
+ "groupDialog": "Gruppo",
+ "groupParent": "Gruppo",
+ "groupNoGroup": "Nessun Gruppo",
+ "settingsTitle": "Impostazioni",
+ "settingsUser": "Profilo",
+ "settingsGroups": "Gruppi",
+ "settingsServer": "Server",
+ "settingsUsers": "Utenti",
+ "settingsDistanceUnit": "Unità distanza",
+ "settingsAltitudeUnit": "Unità altitudine",
+ "settingsSpeedUnit": "Unità velocità",
+ "settingsVolumeUnit": "Unità volume",
+ "settingsTwelveHourFormat": "Formato 12 ore",
+ "settingsCoordinateFormat": "Formato Coordinate",
+ "settingsServerVersion": "Versione server",
+ "settingsAppVersion": "Versione App",
+ "settingsConnection": "Connessione",
+ "settingsDarkMode": "Modalità Notturna",
+ "settingsTotpEnable": "Abilita Password Monouso",
+ "settingsTotpForce": "Forza Password Monouso",
+ "settingsServiceWorkerUpdateInterval": "Intervallo di Aggiornamento di ServiceWorker",
+ "settingsUpdateAvailable": "È disponibile un aggiornamento.",
+ "settingsSupport": "Supporto",
+ "reportTitle": "Rapporti",
+ "reportScheduled": "Rapporto programmato",
+ "reportDevice": "Dispositivo",
+ "reportGroup": "Gruppo",
+ "reportFrom": "Da",
+ "reportTo": "A",
+ "reportShow": "Visualizza",
+ "reportClear": "Pulisci",
+ "linkGoogleMaps": "Mappa Google",
+ "linkAppleMaps": "Mappa Apple",
+ "linkStreetView": "Vista Stradale",
+ "positionFixTime": "Tempo Corretto",
+ "positionDeviceTime": "Orario Dispositivo",
+ "positionServerTime": "Orario Server",
+ "positionValid": "Valido",
+ "positionAccuracy": "Precisione",
+ "positionLatitude": "Latitudine",
+ "positionLongitude": "Longitudine",
+ "positionAltitude": "Altitudine",
+ "positionSpeed": "Velocità",
+ "positionCourse": "Direzione",
+ "positionAddress": "Indirizzo",
+ "positionProtocol": "Protocollo",
+ "positionDistance": "Distanza",
+ "positionRpm": "Giri Motore",
+ "positionFuel": "Carburante",
+ "positionPower": "Alimentazione",
+ "positionBattery": "Batteria",
+ "positionRaw": "Dato grezzo",
+ "positionIndex": "Indice",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelliti",
+ "positionSatVisible": "Satelliti Visibili",
+ "positionRssi": "Segnale GSM",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Evento",
+ "positionAlarm": "Allarme",
+ "positionStatus": "Stato",
+ "positionOdometer": "Odometro",
+ "positionServiceOdometer": "Servizio Odometrico",
+ "positionTripOdometer": "Parziale Odometro",
+ "positionHours": "Ore",
+ "positionSteps": "Passi",
+ "positionInput": "Ingresso",
+ "positionHeartRate": "Frequenza Cardiaca",
+ "positionOutput": "Uscita",
+ "positionBatteryLevel": "Livello Batteria",
+ "positionFuelConsumption": "Consumo Carburante",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Versione Firmware",
+ "positionVersionHw": "Versione Hardware",
+ "positionIgnition": "Accensione",
+ "positionFlags": "Bandiera",
+ "positionCharge": "Carica",
+ "positionIp": "IP",
+ "positionArchive": "Archivio",
+ "positionVin": "VIN",
+ "positionApproximate": "Approssimato",
+ "positionThrottle": "Acceleratore",
+ "positionMotion": "Movimento",
+ "positionArmed": "Armato/Attivo",
+ "positionAcceleration": "Accelerazione",
+ "positionTemp": "Temperatura",
+ "positionDeviceTemp": "Temperatura Dispositivo",
+ "positionCoolantTemp": "Temperatura Motore",
+ "positionOperator": "Operatore",
+ "positionCommand": "Comando",
+ "positionBlocked": "Bloccato",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Velocità OBD",
+ "positionObdOdometer": "Odometro OBD",
+ "positionDrivingTime": "Ore di Guida",
+ "positionDriverUniqueId": "ID Univoco Autista",
+ "positionCard": "Carta",
+ "positionImage": "Immagine",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Impostazioni Server",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registrazione",
+ "serverReadonly": "Sola lettura",
+ "serverForceSettings": "Forza Impostazioni",
+ "serverAnnouncement": "Annuncio",
+ "serverName": "Nome del Server",
+ "serverDescription": "Descrizione del Server",
+ "serverColorPrimary": "Colore Primario",
+ "serverColorSecondary": "Colore Secondario",
+ "serverLogo": "Immagine Logo",
+ "serverLogoInverted": "Immagine Logo Invertita",
+ "serverChangeDisable": "Disattiva cambiamento Server",
+ "serverDisableShare": "Disattiva la Condivisione del Dispositivo",
+ "mapTitle": "Mappa",
+ "mapActive": "Mappe Attive",
+ "mapOverlay": "Soprapposizione Mappa",
+ "mapOverlayCustom": "Soprapposizione Personalizzata",
+ "mapOpenSeaMap": "Mappa OpenSea",
+ "mapOpenRailwayMap": "Mappa OpenRailway",
+ "mapOpenWeatherKey": "OpenWeather Chiave API",
+ "mapOpenWeatherClouds": "OpenWeather Nuvole",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitazioni",
+ "mapOpenWeatherPressure": "OpenWeather Pressione",
+ "mapOpenWeatherWind": "OpenWeather Vento",
+ "mapOpenWeatherTemperature": "OpenWeather Temperatura",
+ "mapLayer": "Livello Mappa",
+ "mapCustom": "Personalizzata (XYZ)",
+ "mapCustomArcgis": "Personalizzata (ArcGIS)",
+ "mapCustomLabel": "Mappa Personalizzata",
+ "mapCarto": "Mappe base di Carto",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Stradale",
+ "mapGoogleHybrid": "Google Ibrida",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Chiave Mappa",
+ "mapBingRoad": "Bing Mappa Stradale",
+ "mapBingAerial": "Bing Mappa Aerea",
+ "mapBingHybrid": "Bing Mappa ibrida",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Mappa",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Stradale",
+ "mapMapboxStreetsDark": "Mapbox Stradale Notturno",
+ "mapMapboxOutdoors": "Mapbox all'Aperto",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Token di Accesso",
+ "mapMapTilerBasic": "MapTiler Base",
+ "mapMapTilerHybrid": "MapTiler Ibrida",
+ "mapMapTilerKey": "MapTiler Chiave API",
+ "mapLocationIqStreets": "LocationIQ Stradale",
+ "mapLocationIqDark": "LocationIQ Notturna",
+ "mapLocationIqKey": "LocationIQ Token di Accesso",
+ "mapTomTomBasic": "TomTom Base",
+ "mapTomTomFlow": "TomTom Traffico Stradale",
+ "mapTomTomIncidents": "TomTom Incidenti Stradali",
+ "mapTomTomKey": "TomTom Chiave API",
+ "mapHereBasic": "Here Base",
+ "mapHereHybrid": "Here Ibrida",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffico Stradale",
+ "mapHereKey": "Here Chiave API",
+ "mapShapePolygon": "Poligono",
+ "mapShapeCircle": "Cerchio",
+ "mapShapePolyline": "Polilinea",
+ "mapLiveRoutes": "Percorso in Diretta",
+ "mapDirection": "Mostra direzione",
+ "mapCurrentLocation": "Posizione Corrente",
+ "mapPoiLayer": "Layer POI",
+ "mapClustering": "Gruppi di marcatori",
+ "mapOnSelect": "Mostra mappa su selezione",
+ "mapDefault": "Mappa predefinita",
+ "stateTitle": "Stato",
+ "stateName": "Attributo",
+ "stateValue": "Valore",
+ "commandTitle": "Comando",
+ "commandSend": "Invia",
+ "commandSent": "Comando inviato",
+ "commandQueued": "Comando accodato",
+ "commandUnit": "Unità",
+ "commandCustom": "Comando Personalizzato",
+ "commandDeviceIdentification": "Identificativo Dispositivo",
+ "commandPositionSingle": "Rapporto Singolo",
+ "commandPositionPeriodic": "Rapporti Periodici",
+ "commandPositionStop": "Ferma Rapporti",
+ "commandEngineStop": "Ferma Motore",
+ "commandEngineResume": "Riavvio Motore",
+ "commandAlarmArm": "Attiva Allarme",
+ "commandAlarmDisarm": "Disattiva Allarme",
+ "commandAlarmDismiss": "Ignora Allarme",
+ "commandSetTimezone": "Imposta Fuso Orario",
+ "commandRequestPhoto": "Richiedi Foto",
+ "commandPowerOff": "Spegni Dispositivo",
+ "commandRebootDevice": "Riavvia Dispositivo",
+ "commandFactoryReset": "Reset di fabbrica",
+ "commandSendSms": "Invia SMS",
+ "commandSendUssd": "Invia USSD",
+ "commandSosNumber": "Imposta Numero SOS",
+ "commandSilenceTime": "Imposta Orario Silenzio",
+ "commandSetPhonebook": "Imposta Rubrica",
+ "commandVoiceMessage": "Messaggio Vocale",
+ "commandOutputControl": "Controllo Uscita",
+ "commandVoiceMonitoring": "Monitoraggio Vocale",
+ "commandSetAgps": "Imposta AGPS",
+ "commandSetIndicator": "Imposta Indicatore",
+ "commandConfiguration": "Configurazione",
+ "commandGetVersion": "Rileva Versione",
+ "commandFirmwareUpdate": "Aggiorna Firmware",
+ "commandSetConnection": "Imposta Connessione",
+ "commandSetOdometer": "Imposta Odometro",
+ "commandGetModemStatus": "Rileva Stato Modem",
+ "commandGetDeviceStatus": "Rileva Stato Dispositivo",
+ "commandSetSpeedLimit": "Imposta Limite Velocità",
+ "commandModePowerSaving": "Modalità di Risparmio Energetico",
+ "commandModeDeepSleep": "Modalità Sonno Profondo",
+ "commandAlarmGeofence": "Imposta Allarme Geo Area",
+ "commandAlarmBattery": "Imposta Allarme Batteria",
+ "commandAlarmSos": "Imposta Allarme SOS",
+ "commandAlarmRemove": "Imposta Rimozione Allarme",
+ "commandAlarmClock": "Imposta Allarme Sveglia",
+ "commandAlarmSpeed": "Imposta Allarme Velocità",
+ "commandAlarmFall": "Imposta Allarme Caduta",
+ "commandAlarmVibration": "Imposta Allarme Vibrazione",
+ "commandFrequency": "Frequenza",
+ "commandTimezone": "Differenza Fuso Orario",
+ "commandMessage": "Messaggio",
+ "commandRadius": "Raggio",
+ "commandEnable": "Attiva",
+ "commandData": "Dati",
+ "commandIndex": "Indice",
+ "commandPhone": "Numero Telefonico",
+ "commandServer": "Server",
+ "commandPort": "Porta",
+ "eventAll": "Tutti gli Eventi",
+ "eventDeviceOnline": "Connesso al server",
+ "eventDeviceUnknown": "Stato sconosciuto",
+ "eventDeviceOffline": "Disconnesso dal Server",
+ "eventDeviceInactive": "Dispositivo non attivo",
+ "eventQueuedCommandSent": "Comando in coda inviato",
+ "eventDeviceMoving": "Dispositivo in movimento",
+ "eventDeviceStopped": "Dispositivo Fermo",
+ "eventDeviceOverspeed": "Limite di velocità superato",
+ "eventDeviceFuelDrop": "Perdita di carburante",
+ "eventDeviceFuelIncrease": "Incremento carburante",
+ "eventCommandResult": "Risultato comando",
+ "eventGeofenceEnter": "Entrato nella Geo Area",
+ "eventGeofenceExit": "Uscito dalla Geo Area",
+ "eventAlarm": "Allarme",
+ "eventIgnitionOn": "Accensione inserita",
+ "eventIgnitionOff": "Accensione disinserita",
+ "eventMaintenance": "Richiesta manutenzione",
+ "eventTextMessage": "Messaggio di testo ricevuto",
+ "eventDriverChanged": "Autista cambiato",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scorri fino all'ultimo",
+ "eventsSoundEvents": "Suono eventi",
+ "eventsSoundAlarms": "Suono allarmi",
+ "alarmGeneral": "Generale",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibrazione",
+ "alarmMovement": "Movimento",
+ "alarmLowspeed": "Bassa Velocità",
+ "alarmOverspeed": "Velocità Eccessiva",
+ "alarmFallDown": "Caduta",
+ "alarmLowPower": "Alimentazione Bassa",
+ "alarmLowBattery": "Batteria Scarica",
+ "alarmFault": "Guasto",
+ "alarmPowerOff": "Spegni",
+ "alarmPowerOn": "Accendi",
+ "alarmDoor": "Porta",
+ "alarmLock": "Blocca",
+ "alarmUnlock": "Sblocca",
+ "alarmGeofence": "Geo Area",
+ "alarmGeofenceEnter": "Ingresso Geo Area",
+ "alarmGeofenceExit": "Uscita Geo Area",
+ "alarmGpsAntennaCut": "Antenna GPS Scollegata",
+ "alarmAccident": "Incidente",
+ "alarmTow": "Inclinazione",
+ "alarmIdle": "Inattivo",
+ "alarmHighRpm": "Giri Motore Elevati",
+ "alarmHardAcceleration": "Accelerazione Brusca",
+ "alarmHardBraking": "Frenata Brusca",
+ "alarmHardCornering": "Curva Stretta",
+ "alarmLaneChange": "Cambio Corsia",
+ "alarmFatigueDriving": "Affaticamento del Guidatore",
+ "alarmPowerCut": "Alimentazione Interrotta",
+ "alarmPowerRestored": "Alimentazione Ripristinata",
+ "alarmJamming": "Disturbatore Frequenze",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Parcheggio",
+ "alarmBonnet": "Cofano",
+ "alarmFootBrake": "Freno a pedale",
+ "alarmFuelLeak": "Perdita carburante",
+ "alarmTampering": "Manomissione",
+ "alarmRemoving": "Rimozione",
+ "notificationType": "Tipo Notifica",
+ "notificationAlways": "Tutti i Dispositivi",
+ "notificationNotificators": "Canali",
+ "notificatorCommand": "Comandi",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Email",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Riguarda il Percorso",
+ "reportCombined": "Combinato",
+ "reportRoute": "Percorso",
+ "reportEvents": "Eventi",
+ "reportTrips": "Viaggi",
+ "reportStops": "Fermate",
+ "reportSummary": "Sommario",
+ "reportDaily": "Riassunto Giornaliero",
+ "reportChart": "Grafico",
+ "reportConfigure": "Configura",
+ "reportEventTypes": "Tipi Evento",
+ "reportChartType": "Tipo Grafico",
+ "reportShowMarkers": "Mostra i marcatori",
+ "reportExport": "Esporta",
+ "reportEmail": "Rapporto Email",
+ "reportSchedule": "Cronoprogramma",
+ "reportPeriod": "Periodo",
+ "reportCustom": "Personalizzato",
+ "reportToday": "Oggi",
+ "reportYesterday": "Ieri",
+ "reportThisWeek": "Settimana Corrente",
+ "reportPreviousWeek": "Settimana Precedente",
+ "reportThisMonth": "Mese Corrente",
+ "reportPreviousMonth": "Mese Precedente",
+ "reportDeviceName": "Nome Dispositivo",
+ "reportAverageSpeed": "Velocità Media",
+ "reportMaximumSpeed": "Velocità Massima",
+ "reportEngineHours": "Ore di Guida",
+ "reportDuration": "Durata",
+ "reportStartDate": "Data di partenza",
+ "reportStartTime": "Ora di Partenza",
+ "reportStartAddress": "Indirizzo di Partenza",
+ "reportEndTime": "Ora di Arrivo",
+ "reportEndAddress": "Indirizzo di Arrivo",
+ "reportSpentFuel": "Carburante Consumato",
+ "reportStartOdometer": "Odometro Inizio",
+ "reportEndOdometer": "Odometro Fine",
+ "statisticsTitle": "Statistiche",
+ "statisticsCaptureTime": "Tempo di Cattura",
+ "statisticsActiveUsers": "Utenti Attivi",
+ "statisticsActiveDevices": "Dispositivi Attivi",
+ "statisticsRequests": "Richieste",
+ "statisticsMessagesReceived": "Messaggi Ricevuti",
+ "statisticsMessagesStored": "Messaggi Salvati",
+ "statisticsGeocoder": "Richieste Geocoder",
+ "statisticsGeolocation": "Richieste Geolocalizzazione",
+ "categoryArrow": "Freccia",
+ "categoryDefault": "Predefinita",
+ "categoryAnimal": "Animale",
+ "categoryBicycle": "Bicicletta",
+ "categoryBoat": "Barca",
+ "categoryBus": "Autobus",
+ "categoryCar": "Automobile",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Gru",
+ "categoryHelicopter": "Elicottero",
+ "categoryMotorcycle": "Moto",
+ "categoryOffroad": "Fuoristrada",
+ "categoryPerson": "Persona",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Aeroplano",
+ "categoryShip": "Nave",
+ "categoryTractor": "Trattore",
+ "categoryTrain": "Treno",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Filobus",
+ "categoryTruck": "Camion",
+ "categoryVan": "Furgone",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Inizio",
+ "maintenancePeriod": "Periodo"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ja.json b/legacy/web/l10n/ja.json
new file mode 100644
index 00000000..3c99b0c0
--- /dev/null
+++ b/legacy/web/l10n/ja.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "読み込み中...",
+ "sharedHide": "非表示",
+ "sharedSave": "保存",
+ "sharedUpload": "Upload",
+ "sharedSet": "設定",
+ "sharedCancel": "キャンセル",
+ "sharedCopy": "Copy",
+ "sharedAdd": "追加",
+ "sharedEdit": "編集",
+ "sharedRemove": "削除",
+ "sharedRemoveConfirm": "アイテムを削除しますか?",
+ "sharedNoData": "データがありません",
+ "sharedSubject": "Subject",
+ "sharedYes": "はい",
+ "sharedNo": "いいえ",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "メートル",
+ "sharedFeet": "フィート",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "時間",
+ "sharedMinute": "分",
+ "sharedSecond": "秒",
+ "sharedDays": "日",
+ "sharedHours": "時間",
+ "sharedMinutes": "分",
+ "sharedDecimalDegrees": "DEG形式(度)",
+ "sharedDegreesDecimalMinutes": "DMM形式(度分)",
+ "sharedDegreesMinutesSeconds": "DMS形式(度分秒)",
+ "sharedName": "名前",
+ "sharedDescription": "説明",
+ "sharedSearch": "検索",
+ "sharedIconScale": "アイコンの大きさ",
+ "sharedGeofence": "ジオフェンス",
+ "sharedGeofences": "ジオフェンス",
+ "sharedCreateGeofence": "ジオフェンスを作成",
+ "sharedNotifications": "通知",
+ "sharedNotification": "通知",
+ "sharedAttributes": "属性",
+ "sharedAttribute": "属性",
+ "sharedDrivers": "ドライバー",
+ "sharedDriver": "ドライバー",
+ "sharedArea": "エリア",
+ "sharedSound": "通知サウンド",
+ "sharedType": "タイプ",
+ "sharedDistance": "距離",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "リットル",
+ "sharedImpGallon": "英ガロン",
+ "sharedUsGallon": "米ガロン",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "地図から情報を取得",
+ "sharedComputedAttribute": "算出属性",
+ "sharedComputedAttributes": "算出属性",
+ "sharedCheckComputedAttribute": "算出属性を確認",
+ "sharedExpression": "式",
+ "sharedDevice": "デバイス",
+ "sharedTest": "テスト",
+ "sharedTestNotification": "テスト通知を送信",
+ "sharedTestNotificators": "チャンネルをテスト",
+ "sharedTestExpression": "式をテスト",
+ "sharedCalendar": "カレンダー",
+ "sharedCalendars": "カレンダー",
+ "sharedFile": "ファイル",
+ "sharedSearchDevices": "デバイスを探す",
+ "sharedSortBy": "並び替え",
+ "sharedFilterMap": "マップのフィルター",
+ "sharedSelectFile": "ファイルを選択",
+ "sharedPhone": "電話",
+ "sharedRequired": "必須項目",
+ "sharedPreferences": "環境設定",
+ "sharedPermissions": "アクセス許可",
+ "sharedConnections": "接続",
+ "sharedExtra": "拡張",
+ "sharedPrimary": "第一",
+ "sharedSecondary": "第二",
+ "sharedTypeString": "文字列",
+ "sharedTypeNumber": "数値",
+ "sharedTypeBoolean": "論理値",
+ "sharedTimezone": "タイムゾーン",
+ "sharedInfoTitle": "情報",
+ "sharedSavedCommand": "保存したコマンド",
+ "sharedSavedCommands": "保存したコマンド",
+ "sharedNew": "新規…",
+ "sharedShowAddress": "住所を表示",
+ "sharedShowDetails": "詳細を見る",
+ "sharedDisabled": "無効",
+ "sharedMaintenance": "メンテナンス",
+ "sharedDeviceAccumulators": "蓄電池",
+ "sharedAlarms": "警報",
+ "sharedLocation": "場所",
+ "sharedImport": "インポート",
+ "sharedColumns": "列",
+ "sharedDropzoneText": "ファイルをドラッグ&ドロップするかクリック",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "シンプル",
+ "calendarRecurrence": "再発",
+ "calendarOnce": "一度",
+ "calendarDaily": "日次",
+ "calendarWeekly": "週次",
+ "calendarMonthly": "月次",
+ "calendarDays": "日",
+ "calendarSunday": "日曜日",
+ "calendarMonday": "月曜日",
+ "calendarTuesday": "火曜日",
+ "calendarWednesday": "水曜日",
+ "calendarThursday": "木曜日",
+ "calendarFriday": "金曜日",
+ "calendarSaturday": "土曜日",
+ "attributeShowGeofences": "ジオフェンスを表示",
+ "attributeSpeedLimit": "速度制限",
+ "attributeFuelDropThreshold": "燃料低下の閾値",
+ "attributeFuelIncreaseThreshold": "燃料増加の閾値",
+ "attributePolylineDistance": "経路距離",
+ "attributeReportIgnoreOdometer": "レポート: 走行距離計を無視する",
+ "attributeWebReportColor": "Web: レポートの色",
+ "attributeDevicePassword": "デバイスパスワード",
+ "attributeDeviceImage": "デバイスのイメージ",
+ "attributeDeviceInactivityStart": "デバイス非アクティブ開始",
+ "attributeDeviceInactivityPeriod": "デバイス非アクティブ期間",
+ "attributeProcessingCopyAttributes": "処理中: 属性のコピー",
+ "attributeColor": "色",
+ "attributeWebLiveRouteLength": "Web: リアルタイム経路長",
+ "attributeWebSelectZoom": "Web: 選択時にズーム",
+ "attributeWebMaxZoom": "Web: 最大化",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover デバイス名",
+ "attributeMailSmtpHost": "メール: SMTP ホスト",
+ "attributeMailSmtpPort": "メール: SMTP ポート",
+ "attributeMailSmtpStarttlsEnable": "メール: SMTP STARTTLS 有効",
+ "attributeMailSmtpStarttlsRequired": "メール: SMTP STARTTLS 要求",
+ "attributeMailSmtpSslEnable": "メール: SMTP SSL 有効",
+ "attributeMailSmtpSslTrust": "メール: SMTP SSL 信頼",
+ "attributeMailSmtpSslProtocols": "メール: SMTP SSL プロトコル",
+ "attributeMailSmtpFrom": "メール: SMTP 元",
+ "attributeMailSmtpAuth": "メール: SMTP 認証有効",
+ "attributeMailSmtpUsername": "メール: SMTP ユーザー名",
+ "attributeMailSmtpPassword": "メール: SMTP パスワード",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI:属性を無効にする",
+ "attributeUiDisableGroups": "UI:グループを無効にする",
+ "attributeUiDisableEvents": "UI: イベントを無効にする",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: ドライバーを無効にする",
+ "attributeUiDisableComputedAttributes": "UI: 計算された属性を無効にする",
+ "attributeUiDisableCalendars": "UI: カレンダーを無効にする",
+ "attributeUiDisableMaintenance": "UI: メンテナンスを無効にする",
+ "attributeUiHidePositionAttributes": "UI: 位置属性を非表示にする",
+ "attributeUiDisableLoginLanguage": "UI:ログイン言語を無効にする",
+ "attributeNotificationTokens": "通知トークン",
+ "attributePopupInfo": "ポップアップ情報",
+ "errorTitle": "エラー",
+ "errorGeneral": "無効なパラメータまたは制約違反",
+ "errorConnection": "接続エラー",
+ "errorSocket": "Web ソケット接続エラー",
+ "errorZero": "0にはできません。",
+ "userEmail": "メール",
+ "userPassword": "パスワード",
+ "userAdmin": "管理者",
+ "userRemember": "記憶する",
+ "userExpirationTime": "有効期限",
+ "userDeviceLimit": "デバイス制限",
+ "userUserLimit": "ユーザー制限",
+ "userDeviceReadonly": "デバイス読み取り専用",
+ "userLimitCommands": "リミットコマンド",
+ "userDisableReports": "レポートを無効にする",
+ "userFixedEmail": "E-Mail変更は無し",
+ "userToken": "トークン",
+ "userDeleteAccount": "アカウントを削除",
+ "userTemporary": "Temporary",
+ "loginTitle": "ログイン",
+ "loginLanguage": "言語",
+ "loginReset": "パスワードをリセット",
+ "loginRegister": "登録",
+ "loginLogin": "ログイン",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "メールアドレスまたはパスワードが間違っています",
+ "loginCreated": "新しいユーザーが登録されました",
+ "loginResetSuccess": "メールを確認してください",
+ "loginUpdateSuccess": "新しいパスワードが設定されました",
+ "loginLogout": "ログアウト",
+ "loginLogo": "ロゴ",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "デバイスと状態",
+ "deviceSelected": "選択したデバイス",
+ "deviceTitle": "デバイス",
+ "devicePrimaryInfo": "デバイスのタイトル",
+ "deviceSecondaryInfo": "デバイスの詳細",
+ "deviceIdentifier": "ID",
+ "deviceModel": "モデル",
+ "deviceContact": "連絡先",
+ "deviceCategory": "カテゴリー",
+ "deviceLastUpdate": "最終更新",
+ "deviceCommand": "コマンド",
+ "deviceFollow": "デバイスを追跡",
+ "deviceTotalDistance": "総距離",
+ "deviceStatus": "ステータス",
+ "deviceStatusOnline": "オンライン",
+ "deviceStatusOffline": "オフライン",
+ "deviceStatusUnknown": "不明",
+ "deviceRegisterFirst": "最初のデバイスを登録",
+ "deviceIdentifierHelp": "IMEI、シリアル番号あるいはその他のID。サーバーに接続するデバイスのIDに一致している必要があります。",
+ "deviceShare": "Share Device",
+ "groupDialog": "グループ",
+ "groupParent": "グループ",
+ "groupNoGroup": "グループなし",
+ "settingsTitle": "設定",
+ "settingsUser": "アカウント",
+ "settingsGroups": "グループ",
+ "settingsServer": "サーバー",
+ "settingsUsers": "ユーザー",
+ "settingsDistanceUnit": "距離の単位",
+ "settingsAltitudeUnit": "高度の単位",
+ "settingsSpeedUnit": "速度の単位",
+ "settingsVolumeUnit": "容量の単位",
+ "settingsTwelveHourFormat": "12 時間形式",
+ "settingsCoordinateFormat": "座標形式",
+ "settingsServerVersion": "サーバーのバージョン",
+ "settingsAppVersion": "アプリのバージョン",
+ "settingsConnection": "接続",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "レポート",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "デバイス",
+ "reportGroup": "グループ",
+ "reportFrom": "開始日時",
+ "reportTo": "終了日時",
+ "reportShow": "詳細",
+ "reportClear": "クリア",
+ "linkGoogleMaps": "Googleマップ",
+ "linkAppleMaps": "Appleマップ",
+ "linkStreetView": "Street View",
+ "positionFixTime": "固定日時",
+ "positionDeviceTime": "デバイスの時刻",
+ "positionServerTime": "サーバーの時刻",
+ "positionValid": "測位",
+ "positionAccuracy": "正確な位置",
+ "positionLatitude": "緯度",
+ "positionLongitude": "経度",
+ "positionAltitude": "高度",
+ "positionSpeed": "速度",
+ "positionCourse": "方角",
+ "positionAddress": "場所",
+ "positionProtocol": "プロトコル",
+ "positionDistance": "距離",
+ "positionRpm": "RPM",
+ "positionFuel": "燃料",
+ "positionPower": "電源",
+ "positionBattery": "バッテリー",
+ "positionRaw": "Raw",
+ "positionIndex": "インデックス",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "衛星の位置",
+ "positionSatVisible": "衛星の表示",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "ローミング",
+ "positionEvent": "イベント",
+ "positionAlarm": "警報",
+ "positionStatus": "ステータス",
+ "positionOdometer": "走行距離計",
+ "positionServiceOdometer": "サービス走行距離計",
+ "positionTripOdometer": "トリップ走行距離計",
+ "positionHours": "時間",
+ "positionSteps": "ステップ",
+ "positionInput": "入力",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "出力",
+ "positionBatteryLevel": "バッテリーレベル",
+ "positionFuelConsumption": "燃料消費",
+ "positionRfid": "RFID",
+ "positionVersionFw": "ファームウェアバージョン",
+ "positionVersionHw": "ハードウェアバージョン",
+ "positionIgnition": "イグニッション",
+ "positionFlags": "フラグ",
+ "positionCharge": "充電",
+ "positionIp": "IP",
+ "positionArchive": "アーカイブ",
+ "positionVin": "VIN",
+ "positionApproximate": "近似",
+ "positionThrottle": "スロットル",
+ "positionMotion": "運動",
+ "positionArmed": "強化",
+ "positionAcceleration": "加速",
+ "positionTemp": "温度",
+ "positionDeviceTemp": "デバイス温度",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "運用",
+ "positionCommand": "コマンド",
+ "positionBlocked": "ブロック",
+ "positionDtcs": "DTC",
+ "positionObdSpeed": "OBD 速度",
+ "positionObdOdometer": "OBD 走行距離計",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "ドライバー固有ID",
+ "positionCard": "Card",
+ "positionImage": "画像",
+ "positionVideo": "ビデオ",
+ "positionAudio": "音声",
+ "serverTitle": "サーバー設定",
+ "serverZoom": "拡大縮小",
+ "serverRegistration": "新規ユーザー登録を許可",
+ "serverReadonly": "読み取り専用",
+ "serverForceSettings": "強制的に設定",
+ "serverAnnouncement": "お知らせ",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "地図",
+ "mapActive": "アクティブなマップ",
+ "mapOverlay": "マップのオーバーレイ",
+ "mapOverlayCustom": "カスタムオーバーレイ",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather APIキー",
+ "mapOpenWeatherClouds": "OpenWeather 雲",
+ "mapOpenWeatherPrecipitation": "OpenWeather 降水量",
+ "mapOpenWeatherPressure": "OpenWeather 気圧",
+ "mapOpenWeatherWind": "OpenWeather 風",
+ "mapOpenWeatherTemperature": "OpenWeather 気温",
+ "mapLayer": "使用する地図",
+ "mapCustom": "カスタム (XYZ)",
+ "mapCustomArcgis": "カスタム (ArcGIS)",
+ "mapCustomLabel": "カスタム地図",
+ "mapCarto": "Cartoベースマップ",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Map 道路",
+ "mapGoogleHybrid": "Google Map ハイブリッド",
+ "mapGoogleSatellite": "Google Map 人工衛星",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bingマップキー",
+ "mapBingRoad": "Bingマップ",
+ "mapBingAerial": "Bing航空写真マップ",
+ "mapBingHybrid": "Bingハイブリッドマップ",
+ "mapBaidu": "百度地図",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandexマップ",
+ "mapYandexSat": "Yandex衛星写真マップ",
+ "mapWikimedia": "ウィキメディア",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocatioIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "多角形",
+ "mapShapeCircle": "円形",
+ "mapShapePolyline": "折れ線形",
+ "mapLiveRoutes": "リアルタイム経路",
+ "mapDirection": "方向を表示",
+ "mapCurrentLocation": "現在の位置",
+ "mapPoiLayer": "POI レイヤー",
+ "mapClustering": "マーカー クラスタリング",
+ "mapOnSelect": "選択をマップで表示",
+ "mapDefault": "デフォルトのマップ",
+ "stateTitle": "詳細",
+ "stateName": "属性",
+ "stateValue": "値",
+ "commandTitle": "コマンド",
+ "commandSend": "送信",
+ "commandSent": "コマンドを送信した。",
+ "commandQueued": "コマンド実行待ち",
+ "commandUnit": "単位",
+ "commandCustom": "カスタムコマンド",
+ "commandDeviceIdentification": "デバイス ID",
+ "commandPositionSingle": "シングルレポート",
+ "commandPositionPeriodic": "定期レポート",
+ "commandPositionStop": "レポートを停止",
+ "commandEngineStop": "エンジン停止",
+ "commandEngineResume": "エンジン再始動",
+ "commandAlarmArm": "警報開始",
+ "commandAlarmDisarm": "警報解除",
+ "commandAlarmDismiss": "警報を無視する",
+ "commandSetTimezone": "タイムゾーンを設定",
+ "commandRequestPhoto": "写真をリクエスト",
+ "commandPowerOff": "デバイス電源 OFF",
+ "commandRebootDevice": "デバイスを再起動",
+ "commandFactoryReset": "工場出荷状態に戻す",
+ "commandSendSms": "SMSを送信",
+ "commandSendUssd": "USSDを送信",
+ "commandSosNumber": "SOS送信先電話番号",
+ "commandSilenceTime": "通知OFF時間帯",
+ "commandSetPhonebook": "電話帳設定",
+ "commandVoiceMessage": "音声メッセージ",
+ "commandOutputControl": "コマンド出力制御",
+ "commandVoiceMonitoring": "音声モニタ",
+ "commandSetAgps": "AGPS を設定",
+ "commandSetIndicator": "通知設定",
+ "commandConfiguration": "設定",
+ "commandGetVersion": "バージョンを取得",
+ "commandFirmwareUpdate": "ファームウェアを更新",
+ "commandSetConnection": "接続を設定",
+ "commandSetOdometer": "走行距離計を設定",
+ "commandGetModemStatus": "モデムのステータスを取得",
+ "commandGetDeviceStatus": "デバイスのステータスを取得",
+ "commandSetSpeedLimit": "速度制限を設定",
+ "commandModePowerSaving": "省電力モード",
+ "commandModeDeepSleep": "ディープスリープモード",
+ "commandAlarmGeofence": "ジオフェンス警報を設定",
+ "commandAlarmBattery": "バッテリー警報を設定",
+ "commandAlarmSos": "SOS警報を設定",
+ "commandAlarmRemove": "取り外し警報を設定",
+ "commandAlarmClock": "時計警報を設定",
+ "commandAlarmSpeed": "速度警報を設定",
+ "commandAlarmFall": "落下警報を設定",
+ "commandAlarmVibration": "振動警報を設定",
+ "commandFrequency": "周期",
+ "commandTimezone": "世界標準時との時差",
+ "commandMessage": "メッセージ",
+ "commandRadius": "Radius",
+ "commandEnable": "有効",
+ "commandData": "データー",
+ "commandIndex": "コマンド一覧",
+ "commandPhone": "電話番号",
+ "commandServer": "サーバー",
+ "commandPort": "ポート",
+ "eventAll": "全てのイベント",
+ "eventDeviceOnline": "オンライン状態",
+ "eventDeviceUnknown": "状態不明",
+ "eventDeviceOffline": "オフライン状態",
+ "eventDeviceInactive": "デバイス非アクティブ",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "デバイス移動中",
+ "eventDeviceStopped": "デバイス停止中",
+ "eventDeviceOverspeed": "速度制限を超過",
+ "eventDeviceFuelDrop": "燃料残量低下",
+ "eventDeviceFuelIncrease": "燃料増加",
+ "eventCommandResult": "コマンドの実行結果",
+ "eventGeofenceEnter": "ジオフェンスに進入しました。",
+ "eventGeofenceExit": "ジオフェンスから退出しました。",
+ "eventAlarm": "警報",
+ "eventIgnitionOn": "イグニッション ON",
+ "eventIgnitionOff": "イグニッション OFF",
+ "eventMaintenance": "メンテナンスが必要です。",
+ "eventTextMessage": "テキストメッセージを受信しました。",
+ "eventDriverChanged": "ドライバーが交代しました。",
+ "eventMedia": "メディア",
+ "eventsScrollToLast": "最後にスクロール",
+ "eventsSoundEvents": "警報イベント",
+ "eventsSoundAlarms": "警報音",
+ "alarmGeneral": "全般",
+ "alarmSos": "SOS",
+ "alarmVibration": "振動",
+ "alarmMovement": "移動",
+ "alarmLowspeed": "低速",
+ "alarmOverspeed": "速度超過",
+ "alarmFallDown": "転倒",
+ "alarmLowPower": "電力低下",
+ "alarmLowBattery": "バッテリー残量低下",
+ "alarmFault": "測位失敗",
+ "alarmPowerOff": "電源 OFF",
+ "alarmPowerOn": "電源 ON",
+ "alarmDoor": "ドア",
+ "alarmLock": "ロック",
+ "alarmUnlock": "ロック解除",
+ "alarmGeofence": "ジオフェンス",
+ "alarmGeofenceEnter": "ジオフェンスに進入",
+ "alarmGeofenceExit": "ジオフェンスから退出",
+ "alarmGpsAntennaCut": "GPSアンテナ切断",
+ "alarmAccident": "事故",
+ "alarmTow": "牽引",
+ "alarmIdle": "アイドリング",
+ "alarmHighRpm": "高 RPM",
+ "alarmHardAcceleration": "急加速",
+ "alarmHardBraking": "急ブレーキ",
+ "alarmHardCornering": "急転回",
+ "alarmLaneChange": "車線変更",
+ "alarmFatigueDriving": "過労運転",
+ "alarmPowerCut": "電源カット",
+ "alarmPowerRestored": "電源が復旧した。",
+ "alarmJamming": "ジャミング",
+ "alarmTemperature": "温度",
+ "alarmParking": "駐車",
+ "alarmBonnet": "ボンネット",
+ "alarmFootBrake": "フットブレーキ",
+ "alarmFuelLeak": "燃料漏れ",
+ "alarmTampering": "窃盗",
+ "alarmRemoving": "取り外し",
+ "notificationType": "通知の種別",
+ "notificationAlways": "すべてのデバイス",
+ "notificationNotificators": "チャンネル",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "メール",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "再生",
+ "reportCombined": "Combined",
+ "reportRoute": "移動経路",
+ "reportEvents": "イベント",
+ "reportTrips": "走行距離",
+ "reportStops": "停止",
+ "reportSummary": "概要",
+ "reportDaily": "日次サマリー",
+ "reportChart": "グラフ",
+ "reportConfigure": "設定",
+ "reportEventTypes": "イベント種別",
+ "reportChartType": "表示するグラフ",
+ "reportShowMarkers": "マーカーを表示",
+ "reportExport": "エクスポート",
+ "reportEmail": "Eメールレポート",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "期間",
+ "reportCustom": "カスタム",
+ "reportToday": "今日",
+ "reportYesterday": "昨日",
+ "reportThisWeek": "今週",
+ "reportPreviousWeek": "先週",
+ "reportThisMonth": "今月",
+ "reportPreviousMonth": "先月",
+ "reportDeviceName": "デバイス名",
+ "reportAverageSpeed": "平均速度",
+ "reportMaximumSpeed": "最高速度",
+ "reportEngineHours": "エンジン稼働時間",
+ "reportDuration": "期間",
+ "reportStartDate": "開始日",
+ "reportStartTime": "開始日時",
+ "reportStartAddress": "出発地",
+ "reportEndTime": "終了日時",
+ "reportEndAddress": "到着地",
+ "reportSpentFuel": "燃料消費量",
+ "reportStartOdometer": "走行距離計開始",
+ "reportEndOdometer": "走行距離計終了",
+ "statisticsTitle": "統計",
+ "statisticsCaptureTime": "位置補足時間",
+ "statisticsActiveUsers": "稼働中ユーザー",
+ "statisticsActiveDevices": "稼働中デバイス",
+ "statisticsRequests": "リクエスト",
+ "statisticsMessagesReceived": "受信したメッセージ",
+ "statisticsMessagesStored": "保存したメッセージ",
+ "statisticsGeocoder": "ジオコーダーリクエスト",
+ "statisticsGeolocation": "ジオロケーションリクエスト",
+ "categoryArrow": "矢印",
+ "categoryDefault": "未指定",
+ "categoryAnimal": "動物",
+ "categoryBicycle": "自転車",
+ "categoryBoat": "ボート",
+ "categoryBus": "バス",
+ "categoryCar": "乗用車",
+ "categoryCamper": "Camper",
+ "categoryCrane": "クレーン",
+ "categoryHelicopter": "ヘリコプター",
+ "categoryMotorcycle": "オートバイ",
+ "categoryOffroad": "オフロード",
+ "categoryPerson": "個人",
+ "categoryPickup": "ピックアップ",
+ "categoryPlane": "航空機",
+ "categoryShip": "船舶",
+ "categoryTractor": "トラクター",
+ "categoryTrain": "鉄道",
+ "categoryTram": "トラム",
+ "categoryTrolleybus": "トロリーバス",
+ "categoryTruck": "トラック",
+ "categoryVan": "バン",
+ "categoryScooter": "スクーター",
+ "maintenanceStart": "メンテナンス開始",
+ "maintenancePeriod": "メンテナンス終了"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ka.json b/legacy/web/l10n/ka.json
new file mode 100644
index 00000000..5a6b4cb2
--- /dev/null
+++ b/legacy/web/l10n/ka.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "იტვირთება...",
+ "sharedHide": "დამალვა",
+ "sharedSave": "შენახვა",
+ "sharedUpload": "Upload",
+ "sharedSet": "დაყენება",
+ "sharedCancel": "უარყოფა",
+ "sharedCopy": "Copy",
+ "sharedAdd": "დამატება",
+ "sharedEdit": "შეცვლა",
+ "sharedRemove": "წაშლა",
+ "sharedRemoveConfirm": "გსურთ წაშლა ?",
+ "sharedNoData": "Მონაცემები არ არის",
+ "sharedSubject": "Subject",
+ "sharedYes": "დიახ",
+ "sharedNo": "არა",
+ "sharedKm": "კმ",
+ "sharedMi": "მლ",
+ "sharedNmi": "nmi",
+ "sharedMeters": "მ",
+ "sharedFeet": "ფუტი",
+ "sharedKn": "kn",
+ "sharedKmh": "კმ/სთ",
+ "sharedMph": "მლ/სთ",
+ "sharedHour": "საათი",
+ "sharedMinute": "წუთი",
+ "sharedSecond": "წამი",
+ "sharedDays": "დღეები",
+ "sharedHours": "საათები",
+ "sharedMinutes": "წუთები",
+ "sharedDecimalDegrees": "ათობითი გრადუსი",
+ "sharedDegreesDecimalMinutes": "გრადუსი ათეული წუთები",
+ "sharedDegreesMinutesSeconds": "გრადუსი ათეული წამები",
+ "sharedName": "დასახელება",
+ "sharedDescription": "აღწერილობა",
+ "sharedSearch": "ძებნა",
+ "sharedIconScale": "იკონკის მასშტაბი",
+ "sharedGeofence": "გეოზონა",
+ "sharedGeofences": "გეოზონები",
+ "sharedCreateGeofence": "შექმენით Geofence",
+ "sharedNotifications": "შეტყობინებები",
+ "sharedNotification": "შეტყობინება",
+ "sharedAttributes": "ატრიბუტები",
+ "sharedAttribute": "ატრიბუტი",
+ "sharedDrivers": "მძღოლები",
+ "sharedDriver": "მძროლი",
+ "sharedArea": "ფართობი",
+ "sharedSound": "შეტყობინების Sound",
+ "sharedType": "ტიპი",
+ "sharedDistance": "დისტანცია",
+ "sharedHourAbbreviation": "ს",
+ "sharedMinuteAbbreviation": "ჭ",
+ "sharedSecondAbbreviation": "წ",
+ "sharedVoltAbbreviation": "ვ",
+ "sharedLiterAbbreviation": "ლ",
+ "sharedGallonAbbreviation": "გალონი",
+ "sharedLiter": "ლიტრი",
+ "sharedImpGallon": "ინგლისური გალონი",
+ "sharedUsGallon": "ამერიკული გალონი",
+ "sharedLiterPerHourAbbreviation": "ლ/სთ",
+ "sharedGetMapState": "რუკის მდგომარეობა",
+ "sharedComputedAttribute": "გამოთვილითი ატრიბუტი",
+ "sharedComputedAttributes": "გამოთვილითი ატრიბუტები",
+ "sharedCheckComputedAttribute": "შეამოწმეთ გამოთვილითი ატრიბუტი",
+ "sharedExpression": "გამოსახულება",
+ "sharedDevice": "ოწყობილობა",
+ "sharedTest": "ტესტი",
+ "sharedTestNotification": "სატესტო შეტყობინების გაგზავნა",
+ "sharedTestNotificators": "სატესტო არხი",
+ "sharedTestExpression": "სატესტო გამოხატულება",
+ "sharedCalendar": "კალენდარი",
+ "sharedCalendars": "კალენდრები",
+ "sharedFile": "ფაილი",
+ "sharedSearchDevices": "მოწყობილობების ძებნა",
+ "sharedSortBy": "დალაგება",
+ "sharedFilterMap": "რუკაზე გაფილტვრა ",
+ "sharedSelectFile": "აირჩიე ფაილი",
+ "sharedPhone": "ტელეფონი",
+ "sharedRequired": "სავალდებულოა",
+ "sharedPreferences": "პრეფერენციები",
+ "sharedPermissions": "უფლებები",
+ "sharedConnections": "კავშირები",
+ "sharedExtra": "დამატებითი",
+ "sharedPrimary": "პირველადი",
+ "sharedSecondary": "მეორადი",
+ "sharedTypeString": "სტრიქონი",
+ "sharedTypeNumber": "ნომერი",
+ "sharedTypeBoolean": "ლოგიკური",
+ "sharedTimezone": "დროის სარტყელი",
+ "sharedInfoTitle": "ინფორმაცია",
+ "sharedSavedCommand": "შენახული ბრძანებება",
+ "sharedSavedCommands": "შენახული ბრძანებები",
+ "sharedNew": "ახალი…",
+ "sharedShowAddress": "მისამართის ჩვენება",
+ "sharedShowDetails": "უფრო ვრცლად",
+ "sharedDisabled": "გამორთულია",
+ "sharedMaintenance": "მომსახურება",
+ "sharedDeviceAccumulators": "აკუმულატორები",
+ "sharedAlarms": "სიგნალიზაცია",
+ "sharedLocation": "ლოკაცია",
+ "sharedImport": "იმპორტი",
+ "sharedColumns": "სვეტი",
+ "sharedDropzoneText": "გადმოათრიეთ ფაილი აქ ან დააწკაპუნეთ",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "მარტივი",
+ "calendarRecurrence": "რეციდივი",
+ "calendarOnce": "ერთხელ",
+ "calendarDaily": "ყოველდღიური",
+ "calendarWeekly": "ყოველკვირეული",
+ "calendarMonthly": "ყოველთვიური",
+ "calendarDays": "Days",
+ "calendarSunday": "კვირა",
+ "calendarMonday": "ორშაბათი",
+ "calendarTuesday": "სამშაბათი",
+ "calendarWednesday": "თხშაბათი",
+ "calendarThursday": "ხუთშაბათი",
+ "calendarFriday": "პარასკევი",
+ "calendarSaturday": "შაბათი",
+ "attributeShowGeofences": "Geofences-ს ჩვენება",
+ "attributeSpeedLimit": "სიჩქარის ლიმიტი",
+ "attributeFuelDropThreshold": "საწვავის ვარდნის ბარიერი",
+ "attributeFuelIncreaseThreshold": "საწვავის გაზრდის ბარიერი",
+ "attributePolylineDistance": "ტეხილის მანძილი",
+ "attributeReportIgnoreOdometer": "Report: ოდომეტრობის იგნორირება",
+ "attributeWebReportColor": "Web: რეპორტის ფერი",
+ "attributeDevicePassword": "მოწყობილობის პაროლი",
+ "attributeDeviceImage": "მოწყობილობის სურათი",
+ "attributeDeviceInactivityStart": "მოწყობილობის უმოქმედობის დაწყება",
+ "attributeDeviceInactivityPeriod": "მოწყობილობის უმოქმედობის პერიოდი",
+ "attributeProcessingCopyAttributes": "დამუშავება: ატრიბუტების კოპირება",
+ "attributeColor": "ფერი",
+ "attributeWebLiveRouteLength": "Web: ცოცხალი მარშრუტის სიგრძე",
+ "attributeWebSelectZoom": "Web: მასშტაბის არჩევა",
+ "attributeWebMaxZoom": "Web: მაქსიმალური ზუმი",
+ "attributeTelegramChatId": "Telegram ჩატის ID",
+ "attributePushoverUserKey": "Pushover-ის მომხმარებლის გასაღები",
+ "attributePushoverDeviceNames": "Pushover-ის მოწყობილობის სახელები",
+ "attributeMailSmtpHost": "Mail: SMTP ჰოსტი",
+ "attributeMailSmtpPort": "Mail: SMTP პორტი",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS ჩართვა",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS სავალდებულოა",
+ "attributeMailSmtpSslEnable": "Mail: SMTP SSL ჩართვა",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL ნდობა",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL პროტოკოლი",
+ "attributeMailSmtpFrom": "Mail: SMTP საიდან",
+ "attributeMailSmtpAuth": "Mail: SMTP აუტენტიფიკაციის ჩართვა",
+ "attributeMailSmtpUsername": "Mail: SMTP სახელი",
+ "attributeMailSmtpPassword": "Mail: SMTP პაროლი",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "მომსხმარებლის ინტერფეისი: გამორთეთ ატრიბუტები",
+ "attributeUiDisableGroups": "მომსხმარებლის ინტერფეისი: ჯგუფების გამორთვა",
+ "attributeUiDisableEvents": "UI: მოვლენების გამორთვა",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: მძღოლების გამორთვა",
+ "attributeUiDisableComputedAttributes": "UI: გამოთვლითი ატრიბუტების გამორთვა",
+ "attributeUiDisableCalendars": "UI: კალენდრის გამორთვა",
+ "attributeUiDisableMaintenance": "UI: ტექნიკური მომსახურება გამორთვა",
+ "attributeUiHidePositionAttributes": "UI: პოზიციის ატრიბუტების დამალვა",
+ "attributeUiDisableLoginLanguage": "მომსხმარებლის ინტერფეისი: გამორთეთ შესვლის ენა",
+ "attributeNotificationTokens": "შეტყობინების ნიშნები",
+ "attributePopupInfo": "ამომხტარი ინფორმაცია",
+ "errorTitle": "შეცდომა",
+ "errorGeneral": "პარამეტრების ან შეზღუდვების არასწორი დარღვევა",
+ "errorConnection": "კავშირის შეცდომა",
+ "errorSocket": "ვებგვერდის კავშირის შეცდომა",
+ "errorZero": "არ შეიძლება იყოს ნული",
+ "userEmail": "ელ-ფოსტა",
+ "userPassword": "პაროლი",
+ "userAdmin": "ადმინი",
+ "userRemember": "დამიმახსოვრე",
+ "userExpirationTime": "ვადის გასვლა",
+ "userDeviceLimit": "მოწყობილობის ლიმიტი",
+ "userUserLimit": "მომხმარებლის ლიმიტი",
+ "userDeviceReadonly": "მოწყობილობა მხოლოდ წაკითხვით",
+ "userLimitCommands": "შეზღუდული ბრძანებები",
+ "userDisableReports": "რეპორტების გამორთვა",
+ "userFixedEmail": "ელფოსტა არ იცვლება",
+ "userToken": "ტოკენი",
+ "userDeleteAccount": "Ანგარიშის წაშლა",
+ "userTemporary": "Temporary",
+ "loginTitle": "ავტორიზაცია",
+ "loginLanguage": "ენა",
+ "loginReset": "პაროლის განულება",
+ "loginRegister": "რეგისტრაცია",
+ "loginLogin": "შესვლა",
+ "loginOpenId": "შედით OpenID-ით",
+ "loginFailed": "არასწორი ელ-ფოსტა ან პაროლი",
+ "loginCreated": "ახალი მომხარებელი დარეგისტრირდა",
+ "loginResetSuccess": "შეამოწმეთ თქვენი ელექტორნული ფოსტა",
+ "loginUpdateSuccess": "ახალი პაროლი დაყენებულია",
+ "loginLogout": "გამოსვლა",
+ "loginLogo": "ლოგო",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "მოწყობილობები და სტატუსი",
+ "deviceSelected": "არჩეული მოწყობილობები",
+ "deviceTitle": "მოწყობილობები",
+ "devicePrimaryInfo": "მოწყობილობის დასახელება",
+ "deviceSecondaryInfo": "მოწყობილობის დეტალები",
+ "deviceIdentifier": "იდენტიფიკატორი",
+ "deviceModel": "მოდელი",
+ "deviceContact": "კონტაქტი",
+ "deviceCategory": "კატეგორია",
+ "deviceLastUpdate": "ბოლო განახლება",
+ "deviceCommand": "ბრძანება",
+ "deviceFollow": "გაყოლა",
+ "deviceTotalDistance": "მთლიანი მანძილი",
+ "deviceStatus": "სტატუსი",
+ "deviceStatusOnline": "ონლაინ რეჟიმი",
+ "deviceStatusOffline": "ოფლაინ რეჟიმი",
+ "deviceStatusUnknown": "უცნობი",
+ "deviceRegisterFirst": "დაარეგისტრირეთ თქვენი პირველი მოწყობილობა",
+ "deviceIdentifierHelp": "IMEI, ან სხვა იდენტიფიკატორი. ის უნდა ემთხვეოდეს იდენტიფიკატორს რომელსაც მოწყობილბა უგზავნის სერვერს",
+ "deviceShare": "Share Device",
+ "groupDialog": "ჯგუფი",
+ "groupParent": "ჯგუფი",
+ "groupNoGroup": "ჯგუფის გარეშე",
+ "settingsTitle": "პარამეტრები",
+ "settingsUser": "პროფილი",
+ "settingsGroups": "ჯგუფები",
+ "settingsServer": "სერვერი",
+ "settingsUsers": "მომხამრებლები",
+ "settingsDistanceUnit": "მანძილის ერთეული",
+ "settingsAltitudeUnit": "სიმაღლის ერთეული",
+ "settingsSpeedUnit": "სიჩქარის ერთეული",
+ "settingsVolumeUnit": "მოცულობის ერთეული",
+ "settingsTwelveHourFormat": "12-საათიანი ფორმატი",
+ "settingsCoordinateFormat": "კოორდინატების ფორმატი",
+ "settingsServerVersion": "სერვერის ვერსია",
+ "settingsAppVersion": "აპლიკაციის ვერსია",
+ "settingsConnection": "კავშირი",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "რეპორტები",
+ "reportScheduled": "დაგეგმილი რეპორტები",
+ "reportDevice": "მოწყობილობა",
+ "reportGroup": "ჯგუფი",
+ "reportFrom": "დან",
+ "reportTo": "მდე",
+ "reportShow": "ჩვენება",
+ "reportClear": "გასუფთავება",
+ "linkGoogleMaps": "Google რუკა",
+ "linkAppleMaps": "Apple რუკა",
+ "linkStreetView": "ქუჩების დათვალიერება",
+ "positionFixTime": "დროის გასწორება",
+ "positionDeviceTime": "მოწყობილობის დრო",
+ "positionServerTime": "სერვერის დრო",
+ "positionValid": "ვარგისი",
+ "positionAccuracy": "სიზუსტე",
+ "positionLatitude": "განედი",
+ "positionLongitude": "გრძედი",
+ "positionAltitude": "სიმაღლე",
+ "positionSpeed": "სიჩქარე",
+ "positionCourse": "კურსი",
+ "positionAddress": "მისამართი",
+ "positionProtocol": "პროტოკოლი",
+ "positionDistance": "დისტანცია",
+ "positionRpm": "ბრუნი წუთში",
+ "positionFuel": "საწვავი",
+ "positionPower": "სიმძლავრე",
+ "positionBattery": "აკუმულატორი",
+ "positionRaw": "Raw",
+ "positionIndex": "ინდექსი",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "თანამგზავრები",
+ "positionSatVisible": "ხილული თანამგზავრები",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "როუმინგი",
+ "positionEvent": "მოვლენა",
+ "positionAlarm": "სიგნალიზაცია",
+ "positionStatus": "სტატუსი",
+ "positionOdometer": "ოდომეტრი",
+ "positionServiceOdometer": "ოდომეტრის სერვისი",
+ "positionTripOdometer": "მოგზაურობის ოდომეტრი",
+ "positionHours": "საათები",
+ "positionSteps": "ნაბიჯები",
+ "positionInput": "შემავალი",
+ "positionHeartRate": "Პულსი",
+ "positionOutput": "გამავალი",
+ "positionBatteryLevel": "აკუმულატორის დონე",
+ "positionFuelConsumption": "საწვავის მოხმარება",
+ "positionRfid": "RFID",
+ "positionVersionFw": "მიკროპროგრამის ვერსია",
+ "positionVersionHw": "მოწყობილობის ვერსია",
+ "positionIgnition": "ავტ. ანთების კლიტე",
+ "positionFlags": "მონიშვნა",
+ "positionCharge": "დამუხტვა",
+ "positionIp": "IP",
+ "positionArchive": "არქივი",
+ "positionVin": "VIN",
+ "positionApproximate": "მიახლოებითი",
+ "positionThrottle": "დროსელი",
+ "positionMotion": "მოძრაობა",
+ "positionArmed": "დაცული",
+ "positionAcceleration": "აჩქარება",
+ "positionTemp": "ტემპერატურა",
+ "positionDeviceTemp": "მოწყობილობის ტემპერატურა",
+ "positionCoolantTemp": "გამაგრილებლის ტემპერატურა",
+ "positionOperator": "ორიენტაცია",
+ "positionCommand": "ბრძანება",
+ "positionBlocked": "დაბლოკილია",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD სიჩქარე",
+ "positionObdOdometer": "OBD ოდომეტრი",
+ "positionDrivingTime": "მართვის დრო",
+ "positionDriverUniqueId": "მძღოლის უნიკალური N",
+ "positionCard": "ბარათი",
+ "positionImage": "სურათი",
+ "positionVideo": "ვიდეო",
+ "positionAudio": "აუდიო",
+ "serverTitle": "სერვერის პარამეტრები",
+ "serverZoom": "ზუმი",
+ "serverRegistration": "რეგისტრაცია",
+ "serverReadonly": "მხოლოდ ნახვის",
+ "serverForceSettings": "იძულებითი პარამეტრები",
+ "serverAnnouncement": "განცხადება",
+ "serverName": "სერვერის სახელი",
+ "serverDescription": "სერვერის აღწერილობა",
+ "serverColorPrimary": "პიველადი ფერი",
+ "serverColorSecondary": "მეორადი ფერი",
+ "serverLogo": "ლოგოს სურათი",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "რუკა",
+ "mapActive": "აქტიური რუკა",
+ "mapOverlay": "რუკის დაფარვა",
+ "mapOverlayCustom": "მორგებული გადაფარვა",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API გასაღები",
+ "mapOpenWeatherClouds": "OpenWeather ღრუბლები",
+ "mapOpenWeatherPrecipitation": "OpenWeather ნალექები",
+ "mapOpenWeatherPressure": "OpenWeather წნევა",
+ "mapOpenWeatherWind": "OpenWeather ქარი",
+ "mapOpenWeatherTemperature": "OpenWeather ტემპერატურა",
+ "mapLayer": "რუკის ფენა",
+ "mapCustom": "მორგებული (XYZ)",
+ "mapCustomArcgis": "მორგებული (ArcGIS)",
+ "mapCustomLabel": "მორგებული რუკა",
+ "mapCarto": "Carto ძირითადი რუკა",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google გზები",
+ "mapGoogleHybrid": "Google ჰიბრიდული",
+ "mapGoogleSatellite": "Google სატელიტი",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps გასაღები",
+ "mapBingRoad": "Bing Maps გზები",
+ "mapBingAerial": "Bing Maps საჰაერო",
+ "mapBingHybrid": "Bing Maps ჰიბრიდული",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex რუკა",
+ "mapYandexSat": "Yandex თანამგზავრული",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "კარტოგრაფიული განყოფილება",
+ "mapMapboxStreets": "Mapbox ქუჩები",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox ღია ცის ქვეშ",
+ "mapMapboxSatellite": "Mapbox სატელიტი",
+ "mapMapboxKey": "Mapbox-ის წვდომის ჟეტონი",
+ "mapMapTilerBasic": "MapTiler ძირითადი",
+ "mapMapTilerHybrid": "MapTiler ჰიბრიდული",
+ "mapMapTilerKey": "MapTiler API გასაღები",
+ "mapLocationIqStreets": "LocationIQ ქუჩები",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ წვდომის ჟეტონი",
+ "mapTomTomBasic": "TomTom ძირითადი",
+ "mapTomTomFlow": "TomTom Სატრანსპორტო ნაკადი",
+ "mapTomTomIncidents": "TomTom საგზაო ინციდენტები",
+ "mapTomTomKey": "TomTom API გასაღები",
+ "mapHereBasic": "Here Basic ძირითადი",
+ "mapHereHybrid": "Here ჰიბრიდი",
+ "mapHereSatellite": "Here სატელიტი",
+ "mapHereFlow": "Here Სატრანსპორტო ნაკადი",
+ "mapHereKey": "Here API გასაღები",
+ "mapShapePolygon": "მრავალკუთხედი",
+ "mapShapeCircle": "წრე",
+ "mapShapePolyline": "ტეხილი ხაზები",
+ "mapLiveRoutes": "ცოცხალი მარშრუტები",
+ "mapDirection": "მიმართულების ჩვენება",
+ "mapCurrentLocation": "ახლანდელი ადგილსამყოფელი",
+ "mapPoiLayer": "POI ფენა",
+ "mapClustering": "მარკერების კლასტერირება",
+ "mapOnSelect": "რუკის ჩვენება არჩევის დროს",
+ "mapDefault": "ნაგულისხმევი რუკა",
+ "stateTitle": "სტატუსი",
+ "stateName": "ატრიბუტი",
+ "stateValue": "მნიშვნელობა",
+ "commandTitle": "ბრძანება",
+ "commandSend": "გაგზავნა",
+ "commandSent": "ბრძანება გაიგზავნილია",
+ "commandQueued": "ბრძანება რიგშია",
+ "commandUnit": "ერთეული",
+ "commandCustom": "მორგებული ბრძანება",
+ "commandDeviceIdentification": "მოწყობილობის იდენტიფიკაცია",
+ "commandPositionSingle": "ერთჯერადი რეპორტი",
+ "commandPositionPeriodic": "პერიოდული რეპორტი",
+ "commandPositionStop": "რეპორტის შეჩერება",
+ "commandEngineStop": "ძრავის გამორთვა",
+ "commandEngineResume": "ძრავის ჩართვა",
+ "commandAlarmArm": "Arm სიგნალიზაცია",
+ "commandAlarmDisarm": "სიგნალიზაციის გამორთვა",
+ "commandAlarmDismiss": "სიგნალიზაციის გათავისუფლება",
+ "commandSetTimezone": "დროის სარტყელის დაყენება",
+ "commandRequestPhoto": "ფოტოს მოთხოვნა",
+ "commandPowerOff": "მოწყობილობის გამორთვა",
+ "commandRebootDevice": "მოწყობილობის გადატვირთვა",
+ "commandFactoryReset": "ქარხნულ პარამეტრებზე დაბრუნება",
+ "commandSendSms": "SMS გაგზავნა",
+ "commandSendUssd": "USSD გაგზავნა",
+ "commandSosNumber": "SOS ნომრის დაყენება",
+ "commandSilenceTime": "დუმილის დროის დაყენება",
+ "commandSetPhonebook": "სატელეფონო წიგნაკის დაყენება",
+ "commandVoiceMessage": "ხმოვანი შეტყობინება",
+ "commandOutputControl": "გამსლელის კონტროლი",
+ "commandVoiceMonitoring": "ხმოვანი მონიტორინგი",
+ "commandSetAgps": "AGPS-ის დაყენება",
+ "commandSetIndicator": "ინდიკატორის დაყენება",
+ "commandConfiguration": "კონფიგურაცია",
+ "commandGetVersion": "ვერსიის მიღება",
+ "commandFirmwareUpdate": "მიკროპროგრამის განახლება",
+ "commandSetConnection": "კავშირის დაყენება",
+ "commandSetOdometer": "ოდომეტრის დაყენება",
+ "commandGetModemStatus": "მოდემის სტატუსი",
+ "commandGetDeviceStatus": "მოწყობილობის სტატუსი",
+ "commandSetSpeedLimit": "სიჩქარის ლიმიტის დაყენება",
+ "commandModePowerSaving": "ენერგიის დაზოგვის რეჟიმი",
+ "commandModeDeepSleep": "ღრმა ძილის რეჟიმი",
+ "commandAlarmGeofence": "დააყენეთ Geofence სიგნალიზაცია",
+ "commandAlarmBattery": "დააყენეთ ბატარეის სიგნალიზაცია",
+ "commandAlarmSos": "დააყენეთ SOS სიგნალიზაცია",
+ "commandAlarmRemove": "დააყენეთ მოხსნის სიგნალიზაცია",
+ "commandAlarmClock": "საათის მაღვიძარას დაყენება",
+ "commandAlarmSpeed": "დააყენეთ სიჩქარის სიგნალიზაცია",
+ "commandAlarmFall": "დააყენეთ დაცემის სიგნალიზაცია",
+ "commandAlarmVibration": "დააყენეთ ვიბრაციის სიგნალიზაცია",
+ "commandFrequency": "სიხშირე",
+ "commandTimezone": "დროის სარტყელი ბიჯი",
+ "commandMessage": "შეტყობინება",
+ "commandRadius": "რადიუსი",
+ "commandEnable": "ჩართვა",
+ "commandData": "თარიღი",
+ "commandIndex": "ინდექსი",
+ "commandPhone": "ტელეფონის N",
+ "commandServer": "სერვერი",
+ "commandPort": "პორტი",
+ "eventAll": "ყველა მოვლენა",
+ "eventDeviceOnline": "ონლაინ სტატუსი",
+ "eventDeviceUnknown": "უცნობი სტატუსი",
+ "eventDeviceOffline": "ოფლაინ სტატუსი",
+ "eventDeviceInactive": "მოწყობილობა არააქტიურია",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "მოწყობილობა მოძრაობს",
+ "eventDeviceStopped": "მოწყობილობა გაჩერებულია",
+ "eventDeviceOverspeed": "სიჩქარის ლიმიტი გადაჭარბებულია",
+ "eventDeviceFuelDrop": "საწვავის დაქცევა",
+ "eventDeviceFuelIncrease": "საწვავის მატება",
+ "eventCommandResult": "ბრძანების შედეგი",
+ "eventGeofenceEnter": "გეოზონა დაყენებულია",
+ "eventGeofenceExit": "გეოზონა გამორთულია",
+ "eventAlarm": "სიგნალიზაცია",
+ "eventIgnitionOn": "ავტ. ანთაება ჩართულია",
+ "eventIgnitionOff": "ავტ. ანთაება გამორთულია",
+ "eventMaintenance": "საჭიროა ტექნიკური სამუშაოების ჩატარება",
+ "eventTextMessage": "მიღებულია ტექსტური შეტყობინება",
+ "eventDriverChanged": "მძღოლის ცვლილება",
+ "eventMedia": "მედია",
+ "eventsScrollToLast": "გადაახვიეთ ბოლომდე",
+ "eventsSoundEvents": "ხმოვანი მოვლენები",
+ "eventsSoundAlarms": "ხმოვანი სიგნალიზაცია",
+ "alarmGeneral": "საერთო",
+ "alarmSos": "SOS",
+ "alarmVibration": "ვიბრაცია",
+ "alarmMovement": "მოძრაობა",
+ "alarmLowspeed": "დაბალი სიჩქარე",
+ "alarmOverspeed": "სიჩქარის გადაჭარბება",
+ "alarmFallDown": "დაცემა",
+ "alarmLowPower": "დაბალი სიმძლავრე",
+ "alarmLowBattery": "Დამჯდარი ელემენტი",
+ "alarmFault": "გაუმართავობა",
+ "alarmPowerOff": "Გამორთულია",
+ "alarmPowerOn": "ჩართულია",
+ "alarmDoor": "კარები",
+ "alarmLock": "დაკეტილია",
+ "alarmUnlock": "გაღებულია",
+ "alarmGeofence": "გეოზონა",
+ "alarmGeofenceEnter": "გეოზონში შესვლა",
+ "alarmGeofenceExit": "გეოზონიდან გამოსვლა",
+ "alarmGpsAntennaCut": "GPS ანტენის კონფიგურაცია",
+ "alarmAccident": "ინციდენტი",
+ "alarmTow": "ბუქსირი",
+ "alarmIdle": "უქმი სვლის რეჟიმი",
+ "alarmHighRpm": "მაღალი RPM",
+ "alarmHardAcceleration": "მძიმე აჩქარება",
+ "alarmHardBraking": "მყარი დამუხრუჭება",
+ "alarmHardCornering": "მყარი მოხვევა",
+ "alarmLaneChange": "მოძრაობის ზოლის ცვლილება",
+ "alarmFatigueDriving": "დაღლილობის მართვა",
+ "alarmPowerCut": "კვების გამორთვა",
+ "alarmPowerRestored": "კვება აღდგენილია",
+ "alarmJamming": "ჭექითი ცვეთა",
+ "alarmTemperature": "ტემპერატურა",
+ "alarmParking": "პარკინგი",
+ "alarmBonnet": "კაპოტი",
+ "alarmFootBrake": "ფეხის მუხრუჭი",
+ "alarmFuelLeak": "საწვავის გაჟონვა",
+ "alarmTampering": "ჩარევა",
+ "alarmRemoving": "ამოღება",
+ "notificationType": "შეტყობინების ტიპი",
+ "notificationAlways": "ყველა მოწყობილობა",
+ "notificationNotificators": "არხები",
+ "notificatorCommand": "ბრძანება",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "გამეორება",
+ "reportCombined": "კომბინირებული",
+ "reportRoute": "მარშრუტი",
+ "reportEvents": "მოვლენები",
+ "reportTrips": "მოგზაურობები",
+ "reportStops": "გაჩერებები",
+ "reportSummary": "შემაჯამებელი",
+ "reportDaily": "ყოველდღიური ჯამი",
+ "reportChart": "დიაგრამა",
+ "reportConfigure": "კონფიგურაცია",
+ "reportEventTypes": "მოვლენის ტიპი",
+ "reportChartType": "დიაგრამის ტიპი",
+ "reportShowMarkers": "მარკერების ჩვენება",
+ "reportExport": "ექსპორტი",
+ "reportEmail": "რეპორტი მეილზე",
+ "reportSchedule": "განრიგი",
+ "reportPeriod": "პერიოდი",
+ "reportCustom": "ხელოვნური",
+ "reportToday": "დღეს",
+ "reportYesterday": "გუშინ",
+ "reportThisWeek": "ეს კვირა",
+ "reportPreviousWeek": "წინა კვირა",
+ "reportThisMonth": "ეს თვე",
+ "reportPreviousMonth": "წინა თვე",
+ "reportDeviceName": "მოწყობილობსი სახელი",
+ "reportAverageSpeed": "საშუალო სიჩქარე",
+ "reportMaximumSpeed": "მაქსიმალური სიჩქარე",
+ "reportEngineHours": "მოტოსაათი",
+ "reportDuration": "ხანგრძლივობა",
+ "reportStartDate": "დაწყების თარიღი",
+ "reportStartTime": "დაწყების დრო",
+ "reportStartAddress": "დაწყების მისამართი",
+ "reportEndTime": "დამთავრების დრო",
+ "reportEndAddress": "დამთავრების მისამართი",
+ "reportSpentFuel": "დახარჯული საწვავი",
+ "reportStartOdometer": "ოდომეტრის სტარტი",
+ "reportEndOdometer": "ოდომეტრის გაჩერება",
+ "statisticsTitle": "სტატისტიკა",
+ "statisticsCaptureTime": "დროის დაწყება",
+ "statisticsActiveUsers": "აქტიური მომხმარებლები",
+ "statisticsActiveDevices": "აქტიური მოწყობილობები",
+ "statisticsRequests": "მოთხოვნები",
+ "statisticsMessagesReceived": "შეტყობინება მიღებულია",
+ "statisticsMessagesStored": "შეტყობინებები შენახულია",
+ "statisticsGeocoder": "გეოკოდერის მოთხოვნა",
+ "statisticsGeolocation": "გეოლოკაციის მოთხოვნა",
+ "categoryArrow": "ისარი",
+ "categoryDefault": "ნაგულისხმევი",
+ "categoryAnimal": "ცხოველი",
+ "categoryBicycle": "მოტოციკლი",
+ "categoryBoat": "ნავი",
+ "categoryBus": "ავტობუსი",
+ "categoryCar": "ავტომანქანა",
+ "categoryCamper": "Camper",
+ "categoryCrane": "ამწე",
+ "categoryHelicopter": "შვეულფრენი",
+ "categoryMotorcycle": "მოტოციკლი",
+ "categoryOffroad": "ოფროუდი",
+ "categoryPerson": "ადამინაი",
+ "categoryPickup": "პიკაპი",
+ "categoryPlane": "პლანერი",
+ "categoryShip": "გემი",
+ "categoryTractor": "ტრაქტორი",
+ "categoryTrain": "მატარებელი",
+ "categoryTram": "ტრამვაი",
+ "categoryTrolleybus": "ტროლეიბუსი",
+ "categoryTruck": "სატვირთო",
+ "categoryVan": "ფურგონი",
+ "categoryScooter": "სკუტერი",
+ "maintenanceStart": "დაწყება",
+ "maintenancePeriod": "პერიოდი"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/kk.json b/legacy/web/l10n/kk.json
new file mode 100644
index 00000000..706f2b78
--- /dev/null
+++ b/legacy/web/l10n/kk.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Жүктеу...",
+ "sharedHide": "Жасыру",
+ "sharedSave": "Сақтау",
+ "sharedUpload": "Upload",
+ "sharedSet": "Орнату",
+ "sharedCancel": "Болдырмау",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Енгізу",
+ "sharedEdit": "Түзету",
+ "sharedRemove": "Жою",
+ "sharedRemoveConfirm": "Элементті жою?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "км",
+ "sharedMi": "мили",
+ "sharedNmi": "теңіз мили",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "тораптар",
+ "sharedKmh": "км/сағ",
+ "sharedMph": "миля/сағ",
+ "sharedHour": "Сағаттар",
+ "sharedMinute": "Минуттар",
+ "sharedSecond": "Секундтар",
+ "sharedDays": "күндер",
+ "sharedHours": "сағат",
+ "sharedMinutes": "минут",
+ "sharedDecimalDegrees": "Ондық Градустар",
+ "sharedDegreesDecimalMinutes": "Градустар Ондық Минуттар",
+ "sharedDegreesMinutesSeconds": "Градустар Минуттар Секундтар",
+ "sharedName": "Атауы",
+ "sharedDescription": "Сипаттамасы",
+ "sharedSearch": "Іздеу",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Геозона",
+ "sharedGeofences": "Геозоналар",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Ескертулер",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "Атрибуттар",
+ "sharedAttribute": "Атрибут",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
+ "sharedArea": "Аймақ",
+ "sharedSound": "Дыбыстық Ескерту",
+ "sharedType": "Түр",
+ "sharedDistance": "Қашықтық",
+ "sharedHourAbbreviation": "с",
+ "sharedMinuteAbbreviation": "м",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Картаның Жағдайын Білу",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "Expression",
+ "sharedDevice": "Құрылғы",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Тестілік Хабарландыру Жіберу",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Күнтізбе",
+ "sharedCalendars": "Күнтізбелер",
+ "sharedFile": "Файл",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Файлды таңдау",
+ "sharedPhone": "Телефон",
+ "sharedRequired": "Міндетті",
+ "sharedPreferences": "Баптау",
+ "sharedPermissions": "Рұқсат",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Экстра",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Number",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Сағаттық белдеу",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Жылдамдықты Шектеу",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Есеп: одометр елемеу",
+ "attributeWebReportColor": "Веб: Түсі Есеп",
+ "attributeDevicePassword": "Құрылғы Құпия Сөз",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Өңдеу: атрибуттары көшіру",
+ "attributeColor": "Түс",
+ "attributeWebLiveRouteLength": "Веб: Белсенді Маршруттың Ұзындығы",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS Enable",
+ "attributeMailSmtpStarttlsRequired": "Пошта: SMTP STARTTLS Required",
+ "attributeMailSmtpSslEnable": "Пошта: SMTP SSL Включить",
+ "attributeMailSmtpSslTrust": "Пошта: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Пошта: SMTP SSL Протокол ",
+ "attributeMailSmtpFrom": "Пошта: SMTP From",
+ "attributeMailSmtpAuth": "Пошта: SMTP Auth Enable",
+ "attributeMailSmtpUsername": "Пошта: SMTP Пайдаланушы",
+ "attributeMailSmtpPassword": "Пошта: SMTP Құпиясөз",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Қате",
+ "errorGeneral": "Қолайсыз бұзылуы параметрлері немесе шектеулер",
+ "errorConnection": "Қосылу қатесі",
+ "errorSocket": "Web socket біріктіру қатесі",
+ "errorZero": "Can't be zero",
+ "userEmail": "Email",
+ "userPassword": "Құпиясөз",
+ "userAdmin": "Әкімші",
+ "userRemember": "Еске сақтау",
+ "userExpirationTime": "Қолданылу мерзімі",
+ "userDeviceLimit": "Құрылғыларды Шектеу",
+ "userUserLimit": "Қолданушылар Лимиті",
+ "userDeviceReadonly": "Құрылғыларды қарау ғана",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Кілт",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Кіру",
+ "loginLanguage": "Тіл",
+ "loginReset": "Reset Password",
+ "loginRegister": "Тіркеу",
+ "loginLogin": "Кіру",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Қате email немесе пароль",
+ "loginCreated": "Жаңа қолданушы тіркелді",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Шығу",
+ "loginLogo": "Логотип",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Құрылғылар және Жай - күйлер",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Құрылғылар",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Идентификатор",
+ "deviceModel": "Моделі",
+ "deviceContact": "Байланыс",
+ "deviceCategory": "Санат",
+ "deviceLastUpdate": "Соңғы жаңарту",
+ "deviceCommand": "Команда",
+ "deviceFollow": "Ілесу",
+ "deviceTotalDistance": "Жалпы Тармақ",
+ "deviceStatus": "Мәртебе",
+ "deviceStatusOnline": "Онлайн",
+ "deviceStatusOffline": "Оффлайн",
+ "deviceStatusUnknown": "Белгісіз",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Топ",
+ "groupParent": "Топ",
+ "groupNoGroup": "Топсыз",
+ "settingsTitle": "Баптау",
+ "settingsUser": "Аккаунт",
+ "settingsGroups": "Топтар",
+ "settingsServer": "Сервер",
+ "settingsUsers": "Қолданушылар",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "12 сағаттық пішім",
+ "settingsCoordinateFormat": "Координат пішімі",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Есептер",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Құрылғы",
+ "reportGroup": "Топ",
+ "reportFrom": "Бастап",
+ "reportTo": "Дейін",
+ "reportShow": "Көрсету",
+ "reportClear": "Тазарту",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Туралық",
+ "positionAccuracy": "Нақтылық",
+ "positionLatitude": "Ендігі",
+ "positionLongitude": "Ұзақтығы",
+ "positionAltitude": "Биіктігі",
+ "positionSpeed": "Жылдамдық",
+ "positionCourse": "Бағыты",
+ "positionAddress": "Мекен-жай",
+ "positionProtocol": "Хаттама",
+ "positionDistance": "Қашықтық",
+ "positionRpm": "RPM",
+ "positionFuel": "Отын",
+ "positionPower": "Қуат көзі",
+ "positionBattery": "Аккумулятор",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Event",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hours",
+ "positionSteps": "Steps",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Battery Level",
+ "positionFuelConsumption": "Fuel Consumption",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Ignition",
+ "positionFlags": "Flags",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Motion",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Device Temperature",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Command",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Серверді баптау",
+ "serverZoom": "Жақындау",
+ "serverRegistration": "Тіркеу",
+ "serverReadonly": "Тек қарап шығу",
+ "serverForceSettings": "Баптауды жылдамдату",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Карта",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Карта қабаты",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps кілті",
+ "mapBingRoad": "Bing Maps жолдары",
+ "mapBingAerial": "Bing Maps Жер серігі",
+ "mapBingHybrid": "Bing Maps Будан",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Яндекс Карталар",
+ "mapYandexSat": "Яндекс Жер серіктері",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Көпбұрыш",
+ "mapShapeCircle": "Шеңбер",
+ "mapShapePolyline": "Сызық",
+ "mapLiveRoutes": "Нақты бағыттар",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Жай күйі",
+ "stateName": "Параметрі",
+ "stateValue": "Мағынасы",
+ "commandTitle": "Команда",
+ "commandSend": "Жіберу",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "Бірліктер",
+ "commandCustom": "Қолданушылар командасы",
+ "commandDeviceIdentification": "Құрылғы идентификациясы",
+ "commandPositionSingle": "Біржолғы қадағалау",
+ "commandPositionPeriodic": "Қадағалауды бастау",
+ "commandPositionStop": "Қадағалауды болдырмау",
+ "commandEngineStop": "Қозғалтқышты бұғаттау",
+ "commandEngineResume": "Қозғалтқышты бұғаттан шығару",
+ "commandAlarmArm": "Сигнал жабдығын іске қосу",
+ "commandAlarmDisarm": "Сигнал жабдығын істен айыру",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Сағаттық белдеуді баптау",
+ "commandRequestPhoto": "Фото сұрау",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Құрылғыны қайта жүктеу",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "СМС жіберу",
+ "commandSendUssd": "USSD жіберу",
+ "commandSosNumber": "Төтенше нөмірді баптау",
+ "commandSilenceTime": "Тыныштық уақытын баптау",
+ "commandSetPhonebook": "Телефон анықтамасын баптау",
+ "commandVoiceMessage": "Дыбыстық хабарлама",
+ "commandOutputControl": "Шығуды бақылау",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Индикаторды орнату",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Жиілік",
+ "commandTimezone": "Уақытша аймақты жылжыту",
+ "commandMessage": "Хабарлама",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Мәліметтер",
+ "commandIndex": "Индексі",
+ "commandPhone": "Телефон нөмірі",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Барлық",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Команда нәтижесі",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Қызмет көрсету геозону",
+ "eventTextMessage": "Мәтіндік хабарлама алынды",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Ескерту түрі",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Бағыт",
+ "reportEvents": "Оқиғалар",
+ "reportTrips": "Сапарлар",
+ "reportStops": "Stops",
+ "reportSummary": "Мәлімет",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Диаграмма",
+ "reportConfigure": "Конфигурациялау",
+ "reportEventTypes": "Оқиға түрі",
+ "reportChartType": "Түр Диаграммалар",
+ "reportShowMarkers": "Маркерлер көрсету",
+ "reportExport": "Экспорт",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "Құрылғы атауы",
+ "reportAverageSpeed": "Орташа жылдамдық",
+ "reportMaximumSpeed": "Максималды жылдамдық",
+ "reportEngineHours": "Мотосағат",
+ "reportDuration": "Ұзақтығы",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Бастапқы уақыт",
+ "reportStartAddress": "Бастапқы мекен-жай",
+ "reportEndTime": "Ақырғы уақыт",
+ "reportEndAddress": "Ақырғы мекен-жай",
+ "reportSpentFuel": "Отын пайдаланылды",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Статистика",
+ "statisticsCaptureTime": "Жинау уақыты",
+ "statisticsActiveUsers": "Белсенді қолданушылар",
+ "statisticsActiveDevices": "Белсенді құрылғылар",
+ "statisticsRequests": "Сұраныстар",
+ "statisticsMessagesReceived": "Хабарлама алынды",
+ "statisticsMessagesStored": "Хабарлама сақталды",
+ "statisticsGeocoder": "Геокодер Сұраулар",
+ "statisticsGeolocation": "Геолокация Сұраулар",
+ "categoryArrow": "Тетік",
+ "categoryDefault": "Қалып бойынша",
+ "categoryAnimal": "Жануар",
+ "categoryBicycle": "Велосипед",
+ "categoryBoat": "Boat",
+ "categoryBus": "Автобус",
+ "categoryCar": "Автомобиль",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "Мотоцикл",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Адам",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Ұшақ",
+ "categoryShip": "Кеме",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Жүк автомобилі",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/km.json b/legacy/web/l10n/km.json
new file mode 100644
index 00000000..d6d38ea8
--- /dev/null
+++ b/legacy/web/l10n/km.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "កំពុងផ្ទុក...",
+ "sharedHide": "លាក់",
+ "sharedSave": "រក្សារទុក",
+ "sharedUpload": "Upload",
+ "sharedSet": "កំណត់",
+ "sharedCancel": "បោះបង់",
+ "sharedCopy": "Copy",
+ "sharedAdd": "បន្ថែម",
+ "sharedEdit": "កែសម្រួល",
+ "sharedRemove": "យកចេញ",
+ "sharedRemoveConfirm": "យកចំណុចចេញ",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "គ.ម",
+ "sharedMi": "ម៉ាយ",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "គ.ម/ម៉ោង",
+ "sharedMph": "ម៉ាយក្នុងមួយម៉ោង",
+ "sharedHour": "ម៉ោង",
+ "sharedMinute": "នាទី",
+ "sharedSecond": "វិនាទី",
+ "sharedDays": "days",
+ "sharedHours": "hours",
+ "sharedMinutes": "minutes",
+ "sharedDecimalDegrees": "អង្សាទសភាគ",
+ "sharedDegreesDecimalMinutes": "អង្សាទសភាគនាទី",
+ "sharedDegreesMinutesSeconds": "អង្សានាទីវិនាទី",
+ "sharedName": "ឈ្មោះ",
+ "sharedDescription": "បរិយាយ",
+ "sharedSearch": "ស្វែងរក",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "កំណត់ភូមិសាស្ត្រ",
+ "sharedGeofences": "កំណត់ភូមិសាស្ត្រ",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "ការជូនដំណឹង",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "គុណលក្ខណៈ",
+ "sharedAttribute": "គុណលក្ខណៈ",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
+ "sharedArea": "តំបន់",
+ "sharedSound": "Notification Sound",
+ "sharedType": "ប្រភេទ",
+ "sharedDistance": "ចម្ងាយ",
+ "sharedHourAbbreviation": "ម៉ោង",
+ "sharedMinuteAbbreviation": "នាទី",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "ទទួលបានការកំណត់ផែនទី",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "Expression",
+ "sharedDevice": "ឧបករណ៍",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send Test Notification",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "ប្រតិទិន",
+ "sharedCalendars": "ប្រតិទិន",
+ "sharedFile": "ឯកសារ",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "ជ្រើសឯកសារ",
+ "sharedPhone": "Phone",
+ "sharedRequired": "Required",
+ "sharedPreferences": "Preferences",
+ "sharedPermissions": "Permissions",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Number",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Timezone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Speed Limit",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Report: Ignore Odometer",
+ "attributeWebReportColor": "Web: Report Color",
+ "attributeDevicePassword": "Device Password",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "Color",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "កំហុស",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "កំហុសក្នុងការតភ្ជាប់",
+ "errorSocket": "កំហុសក្នុងការតភ្ជាប់ Web socket",
+ "errorZero": "Can't be zero",
+ "userEmail": "អ៊ីម៉ែល",
+ "userPassword": "ពាក្យសម្ងាត់",
+ "userAdmin": "អ្នកគ្រប់គ្រង",
+ "userRemember": "សូមចងចាំ",
+ "userExpirationTime": "ការផុតកំណត់",
+ "userDeviceLimit": "កំណត់ចំនួនឧបករណ៍",
+ "userUserLimit": "កំណត់ចំនួនអ្នកប្រើ",
+ "userDeviceReadonly": "ឧបករណ៍បានតែអាន",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "សញ្ញាសម្ងាត់",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "ចូល",
+ "loginLanguage": "ភាសា",
+ "loginReset": "Reset Password",
+ "loginRegister": "ចុះឈ្មោះ",
+ "loginLogin": "ចូល",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "អាសយដ្ឋានអ៊ីម៉ែលឬពាក្យសម្ងាត់មិនត្រឹមត្រូវ",
+ "loginCreated": "អ្នកប្រើថ្មីត្រូវបានចុះបញ្ជី",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "ចាកចេញ",
+ "loginLogo": "រូបសញ្ញា",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "ឧបករណ៍និងសភាព",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "ឧបករណ៍",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "គ្រឿងសម្គាល់",
+ "deviceModel": "គំរូ",
+ "deviceContact": "ទំនក់ទំនង",
+ "deviceCategory": "ប្រភេទ",
+ "deviceLastUpdate": "ទិន្នន័យចុងក្រោយ",
+ "deviceCommand": "ពាក្យបញ្ជា",
+ "deviceFollow": "តាមដាន",
+ "deviceTotalDistance": "ចម្ងាយសរុប",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Unknown",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "ក្រុម",
+ "groupParent": "ក្រុម",
+ "groupNoGroup": "គ្មានក្រុម",
+ "settingsTitle": "ការកំណត់",
+ "settingsUser": "គណនី",
+ "settingsGroups": "ក្រុម",
+ "settingsServer": "ម៉ាស៊ីនមេ",
+ "settingsUsers": "អ្នកប្រើ",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "ទំរង់ 12 ម៉ោង",
+ "settingsCoordinateFormat": "ទំរង់កូអរដោនេ",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "របាយការណ៍",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "ឧបករណ៍",
+ "reportGroup": "ក្រុម",
+ "reportFrom": "ពី",
+ "reportTo": "ទៅកាន់",
+ "reportShow": "បង្ហាញ",
+ "reportClear": "ដើម្បីជម្រះ",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "សុពលភាព",
+ "positionAccuracy": "ភាពត្រឹមត្រូវ",
+ "positionLatitude": "រយៈទទឹង",
+ "positionLongitude": "រយៈបណ្ដោយ",
+ "positionAltitude": "កម្ពស់",
+ "positionSpeed": "ល្បឿន",
+ "positionCourse": "ធ្វើដំណើរ",
+ "positionAddress": "អាសយដ្ឋាន",
+ "positionProtocol": "ពិធីការ",
+ "positionDistance": "ចម្ងាយ",
+ "positionRpm": "RPM",
+ "positionFuel": "Fuel",
+ "positionPower": "Power",
+ "positionBattery": "Battery",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Event",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hours",
+ "positionSteps": "Steps",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Battery Level",
+ "positionFuelConsumption": "Fuel Consumption",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Ignition",
+ "positionFlags": "Flags",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Motion",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Device Temperature",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Command",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "ការកំណត់ម៉ាស៊ីនមេ",
+ "serverZoom": "ពង្រីក",
+ "serverRegistration": "ការចុះឈ្មោះ",
+ "serverReadonly": "អាច​បាន​តែ​អាន",
+ "serverForceSettings": "ការកំណត់កម្លាំង",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "ផែនទី",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "ស្រទាប់ផែនទី",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "ផែនទីគោល Carto",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "គន្លឹះផែនទី Bing",
+ "mapBingRoad": "ផ្លូវ​​​លើផែនទី​​​Bing",
+ "mapBingAerial": "ផែនទីពីលើអាកាស​​​​​​​​​​​​Bing",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "ពហុកោណ",
+ "mapShapeCircle": "រង្វង់",
+ "mapShapePolyline": "ពហុបន្ទាត់",
+ "mapLiveRoutes": "ផ្លូវបន្តផ្ទាល់",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "សភាព",
+ "stateName": "គុណលក្ខណៈ",
+ "stateValue": "តម្លៃ",
+ "commandTitle": "ពាក្យបញ្ជា",
+ "commandSend": "បញ្ជូន",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "ឯកតា",
+ "commandCustom": "ពាក្យបញ្ជាផ្ទាល់ខ្លួន",
+ "commandDeviceIdentification": "អត្តសញ្ញាណឧបករណ៍",
+ "commandPositionSingle": "របាយការណ៍រួមមួយ",
+ "commandPositionPeriodic": "របាយការណ៍តាមកាលកំណត់",
+ "commandPositionStop": "បញ្ឈប់ការបញ្ជូនទិន្នន័យ",
+ "commandEngineStop": "ម៉ាស៊ីនបានបញ្ឈប់",
+ "commandEngineResume": "ម៉ាស៊ីនបានបន្ត",
+ "commandAlarmArm": "ចាប់ផ្តើមសំឡេងរោទិ៍",
+ "commandAlarmDisarm": "បញ្ឈប់សំឡេងរោទិ៍",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "កំណត់តំបន់ពេលវេលា",
+ "commandRequestPhoto": "ស្នើសុំរូបថត",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "ឧបករណ៍ចាប់ផ្ដើមឡើងវិញ",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "ផ្ញើ SMS",
+ "commandSendUssd": "ផ្ញើ USSD",
+ "commandSosNumber": "កំណត់លេខ SOS",
+ "commandSilenceTime": "កំណត់ម៉ោងភាពស្ងប់ស្ងាត់",
+ "commandSetPhonebook": "ដើម្បីកំណត់សៀវភៅទូរស័ព្ទ",
+ "commandVoiceMessage": "សារជាសំឡេង",
+ "commandOutputControl": "ការត្រួតពិនិត្យទិន្នផល",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "កំណត់ចំណាំ",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "ជាញឹកញាប់",
+ "commandTimezone": "តំបន់ពេលវេលា",
+ "commandMessage": "សារ",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "ទិន្នន័យ",
+ "commandIndex": "សន្ទស្សន៍",
+ "commandPhone": "លេខទូរសព្ទ",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "ព្រឹត្តិការណ៍ទាំងអស់",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "លទ្ធផលពាក្យបញ្ជា",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "ថែទាំត្រូវការជាចាំបាច់",
+ "eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "ប្រភេទការជូនដំណឹង",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "ផ្លូវ",
+ "reportEvents": "ព្រឹត្តិការណ៍",
+ "reportTrips": "ការ​ធ្វើដំណើរ",
+ "reportStops": "Stops",
+ "reportSummary": "សេចក្តីសង្ខេប",
+ "reportDaily": "Daily Summary",
+ "reportChart": "គំនូសតាង",
+ "reportConfigure": "កំណត់រចនាសម្ព័ន្ធ",
+ "reportEventTypes": "ប្រភេទព្រឹត្តិការណ៍",
+ "reportChartType": "ប្រភេទគំនូសតាង",
+ "reportShowMarkers": "បង្ហាញសញ្ញាសម្គាល់",
+ "reportExport": "ការនាំចេញ",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "ឈ្មោះឧបករណ៍",
+ "reportAverageSpeed": "ល្បឿន​មធ្យម",
+ "reportMaximumSpeed": "ល្បឿនអតិបរមា",
+ "reportEngineHours": "ម៉ោងម៉ាស៊ីន",
+ "reportDuration": "រយៈពេល",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "ម៉ោងចាប់ផ្តើម",
+ "reportStartAddress": "អាសយដ្ឋានចាប់ផ្តើម",
+ "reportEndTime": "ម៉ោងបញ្ចប់",
+ "reportEndAddress": "អាសយដ្ឋានចុង",
+ "reportSpentFuel": "ការចំណាយប្រេងឥន្ធនៈ",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "ស្ថិតិ",
+ "statisticsCaptureTime": "ពេលការចាប់យក",
+ "statisticsActiveUsers": "អ្នកប្រើប្រាស់សកម្ម",
+ "statisticsActiveDevices": "ឧបករណ៍សកម្ម",
+ "statisticsRequests": "សំណើ",
+ "statisticsMessagesReceived": "សារដែលបានទទួល",
+ "statisticsMessagesStored": "សារដែលបានរក្សាទុក",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "ព្រួញ",
+ "categoryDefault": "លំនាំដើម",
+ "categoryAnimal": "សត្វ",
+ "categoryBicycle": "កង់",
+ "categoryBoat": "Boat",
+ "categoryBus": "រថយន្ដក្រុង",
+ "categoryCar": "រថយន្ត",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "ម៉ូតូ",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "មនុស្ស",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "យន្តហោះ",
+ "categoryShip": "នាវា",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "រថយន្តដឹកទំនិញ",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ko.json b/legacy/web/l10n/ko.json
new file mode 100644
index 00000000..0ba191cf
--- /dev/null
+++ b/legacy/web/l10n/ko.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "로딩중...",
+ "sharedHide": "숨기기",
+ "sharedSave": "저장",
+ "sharedUpload": "Upload",
+ "sharedSet": "확인",
+ "sharedCancel": "취소",
+ "sharedCopy": "Copy",
+ "sharedAdd": "추가",
+ "sharedEdit": "편집",
+ "sharedRemove": "제거",
+ "sharedRemoveConfirm": "제거 하시겠습니까?",
+ "sharedNoData": "비어있음",
+ "sharedSubject": "Subject",
+ "sharedYes": "예",
+ "sharedNo": "아니오",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "1시간",
+ "sharedMinute": "1분",
+ "sharedSecond": "초",
+ "sharedDays": "일",
+ "sharedHours": "시간",
+ "sharedMinutes": "분",
+ "sharedDecimalDegrees": "DD 좌표계",
+ "sharedDegreesDecimalMinutes": "DDM 좌표계",
+ "sharedDegreesMinutesSeconds": "DMS 좌표계",
+ "sharedName": "이름",
+ "sharedDescription": "내용",
+ "sharedSearch": "검색",
+ "sharedIconScale": "아이콘 크기",
+ "sharedGeofence": "지오펜스",
+ "sharedGeofences": "지오펜스",
+ "sharedCreateGeofence": "지오펜스 생성",
+ "sharedNotifications": "알림",
+ "sharedNotification": "알림",
+ "sharedAttributes": "속성",
+ "sharedAttribute": "속성",
+ "sharedDrivers": "운전자",
+ "sharedDriver": "운전자",
+ "sharedArea": "공간",
+ "sharedSound": "알림 소리",
+ "sharedType": "유형",
+ "sharedDistance": "거리",
+ "sharedHourAbbreviation": "시",
+ "sharedMinuteAbbreviation": "분",
+ "sharedSecondAbbreviation": "초",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "L",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "L",
+ "sharedImpGallon": "영국 갤런",
+ "sharedUsGallon": "미국 갤런",
+ "sharedLiterPerHourAbbreviation": "L/H",
+ "sharedGetMapState": "지도 상태 가져오기",
+ "sharedComputedAttribute": "자동화 속성",
+ "sharedComputedAttributes": "자동화 속성",
+ "sharedCheckComputedAttribute": "자동화 속성 테스트",
+ "sharedExpression": "표현",
+ "sharedDevice": "기기",
+ "sharedTest": "테스트",
+ "sharedTestNotification": "테스트 알림 보내기",
+ "sharedTestNotificators": "채널 테스트",
+ "sharedTestExpression": "표현 테스트",
+ "sharedCalendar": "달력",
+ "sharedCalendars": "달력",
+ "sharedFile": "파일",
+ "sharedSearchDevices": "기기 검색",
+ "sharedSortBy": "정렬",
+ "sharedFilterMap": "지도 필터",
+ "sharedSelectFile": "파일 선택",
+ "sharedPhone": "전화번호",
+ "sharedRequired": "필수",
+ "sharedPreferences": "환경 설정",
+ "sharedPermissions": "권한",
+ "sharedConnections": "연결",
+ "sharedExtra": "기타",
+ "sharedPrimary": "주요",
+ "sharedSecondary": "일반",
+ "sharedTypeString": "문자열",
+ "sharedTypeNumber": "숫자",
+ "sharedTypeBoolean": "불리언",
+ "sharedTimezone": "시간대",
+ "sharedInfoTitle": "정보",
+ "sharedSavedCommand": "저장된 커맨드",
+ "sharedSavedCommands": "저장된 커맨드",
+ "sharedNew": "생성...",
+ "sharedShowAddress": "주소 보기",
+ "sharedShowDetails": "상세 보기",
+ "sharedDisabled": "비활성화됨",
+ "sharedMaintenance": "관리",
+ "sharedDeviceAccumulators": "누적",
+ "sharedAlarms": "알림",
+ "sharedLocation": "위치",
+ "sharedImport": "불러오기",
+ "sharedColumns": "열",
+ "sharedDropzoneText": "파일을 가져오거나 여기를 누르세요.",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "심플",
+ "calendarRecurrence": "반복 주기",
+ "calendarOnce": "한번",
+ "calendarDaily": "매일",
+ "calendarWeekly": "매주",
+ "calendarMonthly": "매달",
+ "calendarDays": "일",
+ "calendarSunday": "일요일",
+ "calendarMonday": "월요일",
+ "calendarTuesday": "화요일",
+ "calendarWednesday": "수요일",
+ "calendarThursday": "목요일",
+ "calendarFriday": "금요일",
+ "calendarSaturday": "토요일",
+ "attributeShowGeofences": "지오펜스 표시하기",
+ "attributeSpeedLimit": "속도 제한",
+ "attributeFuelDropThreshold": "기름 감소 한계값",
+ "attributeFuelIncreaseThreshold": "기름 증가 한계값",
+ "attributePolylineDistance": "연속 거리",
+ "attributeReportIgnoreOdometer": "보고: 주행거리 무시",
+ "attributeWebReportColor": "웹: 보고서 색상",
+ "attributeDevicePassword": "기기 비밀번호",
+ "attributeDeviceImage": "기기 이미지",
+ "attributeDeviceInactivityStart": "기기 비활성화 시작",
+ "attributeDeviceInactivityPeriod": "기기 비활성화 주기",
+ "attributeProcessingCopyAttributes": "진행 중: 속성 복사",
+ "attributeColor": "색상",
+ "attributeWebLiveRouteLength": "웹: 라이브 주행거리",
+ "attributeWebSelectZoom": "웹: 확대값 선택",
+ "attributeWebMaxZoom": "웹: 최대 확대값",
+ "attributeTelegramChatId": "텔레그램 채팅 ID",
+ "attributePushoverUserKey": "Pushover 유저키",
+ "attributePushoverDeviceNames": "Pushover 기기이름",
+ "attributeMailSmtpHost": "메일: SMTP 호스트",
+ "attributeMailSmtpPort": "메일: SMTP 포트",
+ "attributeMailSmtpStarttlsEnable": " 메일: SMTP STARTTLS 활성화",
+ "attributeMailSmtpStarttlsRequired": "메일: SMTP STARTTLS 필요함",
+ "attributeMailSmtpSslEnable": "메일: SMTP SSL 활성화",
+ "attributeMailSmtpSslTrust": "메일: SMTP SSL 신뢰",
+ "attributeMailSmtpSslProtocols": "메일: SMTP SSL 프로토콜",
+ "attributeMailSmtpFrom": "메일: SMTP From",
+ "attributeMailSmtpAuth": "메일: SMTP Auth 활성화",
+ "attributeMailSmtpUsername": "메일: SMTP 유저이름",
+ "attributeMailSmtpPassword": "메일: SMTP 비밀번호",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: 속성 비활성화",
+ "attributeUiDisableGroups": "UI: 그룹 비활성화",
+ "attributeUiDisableEvents": "UI: 이벤트 비활성화",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: 운전자 비활성화",
+ "attributeUiDisableComputedAttributes": "UI: 자동화 속성 비활성화",
+ "attributeUiDisableCalendars": "UI: 달력 비활성화",
+ "attributeUiDisableMaintenance": "UI: 관리 비활성화",
+ "attributeUiHidePositionAttributes": "UI: 위치 정보 숨기기",
+ "attributeUiDisableLoginLanguage": "UI: 로그인 언어 숨기기",
+ "attributeNotificationTokens": "알림 토큰",
+ "attributePopupInfo": "팝업 정보",
+ "errorTitle": "오류",
+ "errorGeneral": "부적절한 매개변수 또는 범위 초과",
+ "errorConnection": "연결 오류",
+ "errorSocket": "웹 소켓 연결 오류",
+ "errorZero": "0이 될 수 없음",
+ "userEmail": "이메일",
+ "userPassword": "비밀번호",
+ "userAdmin": "관리자",
+ "userRemember": "저장하기",
+ "userExpirationTime": "기간 제한",
+ "userDeviceLimit": "기기 제한",
+ "userUserLimit": "사용자 제한",
+ "userDeviceReadonly": "기기 읽기전용",
+ "userLimitCommands": "커맨드 제한",
+ "userDisableReports": "보고서 비활성화",
+ "userFixedEmail": "이메일 변경 제한",
+ "userToken": "토큰",
+ "userDeleteAccount": "계정 삭제",
+ "userTemporary": "Temporary",
+ "loginTitle": "로그인",
+ "loginLanguage": "언어",
+ "loginReset": "비밀번호 초기화",
+ "loginRegister": "회원가입",
+ "loginLogin": "로그인",
+ "loginOpenId": "오픈ID로 로그인",
+ "loginFailed": "이메일 또는 비밀번호가 틀렸습니다",
+ "loginCreated": "회원가입 되었습니다.",
+ "loginResetSuccess": "이메일을 확인해주세요",
+ "loginUpdateSuccess": "비밀번호가 변경되었습니다",
+ "loginLogout": "로그아웃",
+ "loginLogo": "로고",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "기기와 상태",
+ "deviceSelected": "선택된 기기",
+ "deviceTitle": "기기",
+ "devicePrimaryInfo": "기기 이름",
+ "deviceSecondaryInfo": "기기 설명",
+ "deviceIdentifier": "고유값",
+ "deviceModel": "모델명",
+ "deviceContact": "연락처",
+ "deviceCategory": "카테고리",
+ "deviceLastUpdate": "마지막 변경",
+ "deviceCommand": "커맨드",
+ "deviceFollow": "따라가기",
+ "deviceTotalDistance": "총 주행거리",
+ "deviceStatus": "상태",
+ "deviceStatusOnline": "온라인",
+ "deviceStatusOffline": "오프라인",
+ "deviceStatusUnknown": "알 수 없음",
+ "deviceRegisterFirst": "첫 기기를 등록하세요",
+ "deviceIdentifierHelp": "IMEI, 일련번호와 같은 고유한 ID로 기기를 식별합니다.",
+ "deviceShare": "Share Device",
+ "groupDialog": "그룹",
+ "groupParent": "그룹",
+ "groupNoGroup": "그룹 없음",
+ "settingsTitle": "설정",
+ "settingsUser": "계정",
+ "settingsGroups": "그룹",
+ "settingsServer": "서버",
+ "settingsUsers": "사용자",
+ "settingsDistanceUnit": "거리 단위",
+ "settingsAltitudeUnit": "고도 단위",
+ "settingsSpeedUnit": "속도 단위",
+ "settingsVolumeUnit": "부피 단위",
+ "settingsTwelveHourFormat": "12시 형식",
+ "settingsCoordinateFormat": "좌표 형식",
+ "settingsServerVersion": "서버 버전",
+ "settingsAppVersion": "앱 버전",
+ "settingsConnection": "연결 상태",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "보고서",
+ "reportScheduled": "예정된 보고서",
+ "reportDevice": "기기",
+ "reportGroup": "그룹",
+ "reportFrom": "발신자",
+ "reportTo": "수신자",
+ "reportShow": "보이기",
+ "reportClear": "초기화",
+ "linkGoogleMaps": "구글 지도",
+ "linkAppleMaps": "애플 지도",
+ "linkStreetView": "스트리트 뷰",
+ "positionFixTime": "Fix 시간",
+ "positionDeviceTime": "기기 시간",
+ "positionServerTime": "서버 시간",
+ "positionValid": "유효성",
+ "positionAccuracy": "정확성",
+ "positionLatitude": "위도",
+ "positionLongitude": "경도",
+ "positionAltitude": "고도",
+ "positionSpeed": "속도",
+ "positionCourse": "코스",
+ "positionAddress": "주소",
+ "positionProtocol": "프로토콜",
+ "positionDistance": "거리",
+ "positionRpm": "RPM",
+ "positionFuel": "기름",
+ "positionPower": "전압",
+ "positionBattery": "배터리",
+ "positionRaw": "Raw",
+ "positionIndex": "인덱스",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "위성 수",
+ "positionSatVisible": "이용 중인 위성 수",
+ "positionRssi": "신호강도",
+ "positionGps": "GPS",
+ "positionRoaming": "로밍",
+ "positionEvent": "이벤트",
+ "positionAlarm": "알림",
+ "positionStatus": "상태",
+ "positionOdometer": "주행 거리계",
+ "positionServiceOdometer": "서비스 주행 거리계",
+ "positionTripOdometer": "구간 거리계",
+ "positionHours": "시간",
+ "positionSteps": "걸음 수",
+ "positionInput": "입력",
+ "positionHeartRate": "동기화 주기",
+ "positionOutput": "출력",
+ "positionBatteryLevel": "배터리 레벨",
+ "positionFuelConsumption": "기름 소비량",
+ "positionRfid": "RFID",
+ "positionVersionFw": "펌웨어 버전",
+ "positionVersionHw": "하드웨어 버전",
+ "positionIgnition": "시동",
+ "positionFlags": "플래그",
+ "positionCharge": "충전",
+ "positionIp": "IP",
+ "positionArchive": "저장됨",
+ "positionVin": "VIN",
+ "positionApproximate": "추정",
+ "positionThrottle": "스로틀",
+ "positionMotion": "움직임",
+ "positionArmed": "장착됨",
+ "positionAcceleration": "가속도",
+ "positionTemp": "온도",
+ "positionDeviceTemp": "기기 온도",
+ "positionCoolantTemp": "냉각수 온도",
+ "positionOperator": "소유자",
+ "positionCommand": "커맨드",
+ "positionBlocked": "차단됨",
+ "positionDtcs": "속도계",
+ "positionObdSpeed": "OBD 속도",
+ "positionObdOdometer": "OBD 주행거리",
+ "positionDrivingTime": "주행 시간",
+ "positionDriverUniqueId": "운전자 ID",
+ "positionCard": "카드",
+ "positionImage": "이미지",
+ "positionVideo": "비디오",
+ "positionAudio": "오디오",
+ "serverTitle": "서버 설정",
+ "serverZoom": "배율",
+ "serverRegistration": "회원가입",
+ "serverReadonly": "읽기 전용",
+ "serverForceSettings": "강제 설정",
+ "serverAnnouncement": "공지사항",
+ "serverName": "서버 이름",
+ "serverDescription": "서버 설명",
+ "serverColorPrimary": "주요 색상",
+ "serverColorSecondary": "일반 색상",
+ "serverLogo": "로고 이미지",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "지도",
+ "mapActive": "활성화된 지도",
+ "mapOverlay": "지도 오버레이",
+ "mapOverlayCustom": "커스텀 오버레이",
+ "mapOpenSeaMap": "OpenSea 지도",
+ "mapOpenRailwayMap": "OpenRailway 지도",
+ "mapOpenWeatherKey": "OpenWeather API 키",
+ "mapOpenWeatherClouds": "OpenWeather 구름",
+ "mapOpenWeatherPrecipitation": "OpenWeather 강수량",
+ "mapOpenWeatherPressure": "OpenWeather 기압",
+ "mapOpenWeatherWind": "OpenWeather 바람",
+ "mapOpenWeatherTemperature": "OpenWeather 온도",
+ "mapLayer": "지도 레이어",
+ "mapCustom": "커스텀 (XYZ)",
+ "mapCustomArcgis": "커스텀 (ArcGIS)",
+ "mapCustomLabel": "커스텀 지도",
+ "mapCarto": "Carto 지도",
+ "mapOsm": "OpenStreet 지도",
+ "mapGoogleRoad": "구글 지도",
+ "mapGoogleHybrid": "구글 하이브리드 지도",
+ "mapGoogleSatellite": "구글 위성 지도",
+ "mapOpenTopoMap": "OpenTopo 지도",
+ "mapBingKey": "빙 지도 키",
+ "mapBingRoad": "빙 도로 지도",
+ "mapBingAerial": "빙 위성 지도",
+ "mapBingHybrid": "빙 하이브리드 지도",
+ "mapBaidu": "바이두",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "얀덱스 지도",
+ "mapYandexSat": "얀덱스 위성 지도",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox 도로 지도",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox 실외 지도",
+ "mapMapboxSatellite": "Mapbox 위성 지도",
+ "mapMapboxKey": "Mapbox 액세스 토큰",
+ "mapMapTilerBasic": "MapTiler 기본 지도",
+ "mapMapTilerHybrid": "MapTiler 하이브리드 지도",
+ "mapMapTilerKey": "MapTiler API 키",
+ "mapLocationIqStreets": "LocationIQ 도로 지도",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ 액세스 토큰",
+ "mapTomTomBasic": "톰톰 기본 지도",
+ "mapTomTomFlow": "톰톰 교통정보 지도",
+ "mapTomTomIncidents": "톰톰 교통사고 지도",
+ "mapTomTomKey": "톰톰 API 키",
+ "mapHereBasic": "Here 기본 지도",
+ "mapHereHybrid": "Here 하이브리드 지도",
+ "mapHereSatellite": "Here 위성 지도",
+ "mapHereFlow": "Here 교통정보 지도",
+ "mapHereKey": "Here API 키",
+ "mapShapePolygon": "다각형",
+ "mapShapeCircle": "원",
+ "mapShapePolyline": "연속선",
+ "mapLiveRoutes": "실시간 경로",
+ "mapDirection": "방향 표시하기",
+ "mapCurrentLocation": "현재 위치",
+ "mapPoiLayer": "POI 레이어",
+ "mapClustering": "마커 군집화",
+ "mapOnSelect": "선택 시 지도에 표시하기",
+ "mapDefault": "기본 지도",
+ "stateTitle": "상태",
+ "stateName": "속성",
+ "stateValue": "값",
+ "commandTitle": "커맨드",
+ "commandSend": "전송",
+ "commandSent": "커맨드 전송됨",
+ "commandQueued": "커맨드 대기중",
+ "commandUnit": "단위",
+ "commandCustom": "커스텀 커맨드",
+ "commandDeviceIdentification": "장치 식별자",
+ "commandPositionSingle": "일회성 보고",
+ "commandPositionPeriodic": "정기적 보고",
+ "commandPositionStop": "보고 중지",
+ "commandEngineStop": "엔진 정지",
+ "commandEngineResume": "엔진 활성화",
+ "commandAlarmArm": "경보",
+ "commandAlarmDisarm": "경보 해제",
+ "commandAlarmDismiss": "경보 확인",
+ "commandSetTimezone": "시간대 설정",
+ "commandRequestPhoto": "사진 요청",
+ "commandPowerOff": "기기 종료",
+ "commandRebootDevice": "기기 재부팅",
+ "commandFactoryReset": "공장초기화",
+ "commandSendSms": "문자 보내기",
+ "commandSendUssd": "USSD 보내기",
+ "commandSosNumber": "긴급번호 설정",
+ "commandSilenceTime": "알림 금지 시간대",
+ "commandSetPhonebook": "연락처 설정",
+ "commandVoiceMessage": "음성 메시지",
+ "commandOutputControl": "출력 제어",
+ "commandVoiceMonitoring": "음성 모니터링",
+ "commandSetAgps": "AGPS 설정",
+ "commandSetIndicator": "방향 설정",
+ "commandConfiguration": "설정",
+ "commandGetVersion": "버전 정보",
+ "commandFirmwareUpdate": "펌웨어 업데이트",
+ "commandSetConnection": "연결 설정",
+ "commandSetOdometer": "주행거리 설정",
+ "commandGetModemStatus": "모뎀 정보",
+ "commandGetDeviceStatus": "기기 정보",
+ "commandSetSpeedLimit": "속도 제한",
+ "commandModePowerSaving": "절전 모드",
+ "commandModeDeepSleep": "딥슬립 모드",
+ "commandAlarmGeofence": "지오펜스 알림",
+ "commandAlarmBattery": "배터리 알림",
+ "commandAlarmSos": "SOS 알림",
+ "commandAlarmRemove": "알림 제거",
+ "commandAlarmClock": "시간 알림",
+ "commandAlarmSpeed": "속도 알림",
+ "commandAlarmFall": "추락 알림",
+ "commandAlarmVibration": "진동 알림",
+ "commandFrequency": "주기",
+ "commandTimezone": "시간대 오프셋",
+ "commandMessage": "메시지",
+ "commandRadius": "반경",
+ "commandEnable": "활성화",
+ "commandData": "데이터",
+ "commandIndex": "인덱스",
+ "commandPhone": "연락처",
+ "commandServer": "서버",
+ "commandPort": "포트",
+ "eventAll": "모든 이벤트",
+ "eventDeviceOnline": "온라인 상태",
+ "eventDeviceUnknown": "상태 알 수 없음",
+ "eventDeviceOffline": "오프라인 상태",
+ "eventDeviceInactive": "기기 비활성화",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "기기 이동 중",
+ "eventDeviceStopped": "기기 정지",
+ "eventDeviceOverspeed": "속도 제한 초과",
+ "eventDeviceFuelDrop": "기름 부족",
+ "eventDeviceFuelIncrease": "기름 증가",
+ "eventCommandResult": "커맨드 결과",
+ "eventGeofenceEnter": "지오펜스 진입",
+ "eventGeofenceExit": "지오펜스 퇴장",
+ "eventAlarm": "알림",
+ "eventIgnitionOn": "시동 켜짐",
+ "eventIgnitionOff": "시동 꺼짐",
+ "eventMaintenance": "관리 필요",
+ "eventTextMessage": "메시지가 왔습니다",
+ "eventDriverChanged": "운전자 변경됨",
+ "eventMedia": "미디어",
+ "eventsScrollToLast": "마지막으로 이동",
+ "eventsSoundEvents": "소리 이벤트",
+ "eventsSoundAlarms": "소리 알림",
+ "alarmGeneral": "일반",
+ "alarmSos": "SOS",
+ "alarmVibration": "진동",
+ "alarmMovement": "움직임",
+ "alarmLowspeed": "저속",
+ "alarmOverspeed": "과속",
+ "alarmFallDown": "떨어짐",
+ "alarmLowPower": "파워 부족",
+ "alarmLowBattery": "배터리 부족",
+ "alarmFault": "오류",
+ "alarmPowerOff": "꺼짐",
+ "alarmPowerOn": "켜짐",
+ "alarmDoor": "문",
+ "alarmLock": "잠김",
+ "alarmUnlock": "잠금해제",
+ "alarmGeofence": "지오펜스",
+ "alarmGeofenceEnter": "지오펜스 진입",
+ "alarmGeofenceExit": "지오펜스 퇴장",
+ "alarmGpsAntennaCut": "GPS 안테나 잘림",
+ "alarmAccident": "사고",
+ "alarmTow": "견인",
+ "alarmIdle": "대기",
+ "alarmHighRpm": "RPM 높음",
+ "alarmHardAcceleration": "급가속",
+ "alarmHardBraking": "급브레이크",
+ "alarmHardCornering": "급코너링",
+ "alarmLaneChange": "차선 변경",
+ "alarmFatigueDriving": "운전자 피로",
+ "alarmPowerCut": "전원 끊김",
+ "alarmPowerRestored": "전원 복구됨",
+ "alarmJamming": "전파 방해",
+ "alarmTemperature": "온도",
+ "alarmParking": "주차",
+ "alarmBonnet": "후드 열림",
+ "alarmFootBrake": "풋 브레이크",
+ "alarmFuelLeak": "기름 누출",
+ "alarmTampering": "변조됨",
+ "alarmRemoving": "제거됨",
+ "notificationType": "알림 유형",
+ "notificationAlways": "전체 기기",
+ "notificationNotificators": "채널",
+ "notificatorCommand": "커맨드",
+ "notificatorWeb": "웹",
+ "notificatorMail": "메일",
+ "notificatorSms": "메시지",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "텔레그램",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "리플레이",
+ "reportCombined": "혼합",
+ "reportRoute": "경로",
+ "reportEvents": "이벤트",
+ "reportTrips": "구간",
+ "reportStops": "정지",
+ "reportSummary": "요약",
+ "reportDaily": "일일 요약",
+ "reportChart": "차트",
+ "reportConfigure": "설정",
+ "reportEventTypes": "이벤트 유형",
+ "reportChartType": "차트 유형",
+ "reportShowMarkers": "마커 표시",
+ "reportExport": "내보내기",
+ "reportEmail": "이메일 보고",
+ "reportSchedule": "스케줄",
+ "reportPeriod": "주기",
+ "reportCustom": "커스텀",
+ "reportToday": "오늘",
+ "reportYesterday": "어제",
+ "reportThisWeek": "이번주",
+ "reportPreviousWeek": "지난주",
+ "reportThisMonth": "이번달",
+ "reportPreviousMonth": "지난달",
+ "reportDeviceName": "기기 이름",
+ "reportAverageSpeed": "평균 속도",
+ "reportMaximumSpeed": "최대 속도",
+ "reportEngineHours": "엔진 시간",
+ "reportDuration": "기간",
+ "reportStartDate": "시작일",
+ "reportStartTime": "시작시간",
+ "reportStartAddress": "시작주소",
+ "reportEndTime": "종료시간",
+ "reportEndAddress": "종료주소",
+ "reportSpentFuel": "사용한 연료",
+ "reportStartOdometer": "주행거리계 시작",
+ "reportEndOdometer": "주행거리계 종료",
+ "statisticsTitle": "통계",
+ "statisticsCaptureTime": "캡처 시간",
+ "statisticsActiveUsers": "활성화된 유저",
+ "statisticsActiveDevices": "활성화된 기기",
+ "statisticsRequests": "요청",
+ "statisticsMessagesReceived": "수신된 메시지",
+ "statisticsMessagesStored": "저장한 메세지",
+ "statisticsGeocoder": "지오코더 요청",
+ "statisticsGeolocation": "지오로케이션 요청",
+ "categoryArrow": "화살표",
+ "categoryDefault": "기본값",
+ "categoryAnimal": "동물",
+ "categoryBicycle": "자전거",
+ "categoryBoat": "배",
+ "categoryBus": "버스",
+ "categoryCar": "차",
+ "categoryCamper": "Camper",
+ "categoryCrane": "크레인",
+ "categoryHelicopter": "헬리콥터",
+ "categoryMotorcycle": "오토바이",
+ "categoryOffroad": "오프로드",
+ "categoryPerson": "사람",
+ "categoryPickup": "픽업 트럭",
+ "categoryPlane": "비행기",
+ "categoryShip": "배",
+ "categoryTractor": "트랙터",
+ "categoryTrain": "기차",
+ "categoryTram": "트램",
+ "categoryTrolleybus": "트롤리 버스",
+ "categoryTruck": "트럭",
+ "categoryVan": "밴",
+ "categoryScooter": "오토바이",
+ "maintenanceStart": "시작",
+ "maintenancePeriod": "주기"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/lo.json b/legacy/web/l10n/lo.json
new file mode 100644
index 00000000..d0a40085
--- /dev/null
+++ b/legacy/web/l10n/lo.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "ກຳລັງໂຫລດ...",
+ "sharedHide": "Hide",
+ "sharedSave": "ບັນທຶກ",
+ "sharedUpload": "Upload",
+ "sharedSet": "Set",
+ "sharedCancel": "ຍົກເລີກ",
+ "sharedCopy": "Copy",
+ "sharedAdd": "ເພີ່ມ",
+ "sharedEdit": "ແກ້ໄຂ",
+ "sharedRemove": "ລົບອອກ",
+ "sharedRemoveConfirm": "ລົບລາຍການນີ້ບໍ່?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "ກມ.",
+ "sharedMi": "ໄມລ໌",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "ນ໊ອດ",
+ "sharedKmh": "ກມ. /ຊມ.",
+ "sharedMph": "ໄມລ໌ຕໍ່ຊົ່ວໂມງ",
+ "sharedHour": "ຊົ່ວໂມງ",
+ "sharedMinute": "ນາທີ",
+ "sharedSecond": "ວິນາທີ",
+ "sharedDays": "days",
+ "sharedHours": "hours",
+ "sharedMinutes": "minutes",
+ "sharedDecimalDegrees": "Decimal Degrees",
+ "sharedDegreesDecimalMinutes": "Degrees Decimal Minutes",
+ "sharedDegreesMinutesSeconds": "Degrees Minutes Seconds",
+ "sharedName": "ຊື່",
+ "sharedDescription": "ລັກສະນະ",
+ "sharedSearch": "ຄົ້ນຫາ",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "ເຂດພື້ນທີ່",
+ "sharedGeofences": "ເຂດພື້ນທີ່",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "ການແຈ້ງເຕືອນ",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "ຄຸນລັກສະນະ",
+ "sharedAttribute": "ຄຸນລັກສະນະ",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
+ "sharedArea": "ພື້ນທີ່",
+ "sharedSound": "Notification Sound",
+ "sharedType": "Type",
+ "sharedDistance": "Distance",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Get Map State",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "Expression",
+ "sharedDevice": "Device",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send Test Notification",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Calendar",
+ "sharedCalendars": "Calendars",
+ "sharedFile": "File",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Select File",
+ "sharedPhone": "Phone",
+ "sharedRequired": "Required",
+ "sharedPreferences": "Preferences",
+ "sharedPermissions": "Permissions",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Number",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Timezone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Speed Limit",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Report: Ignore Odometer",
+ "attributeWebReportColor": "Web: Report Color",
+ "attributeDevicePassword": "Device Password",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "Color",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "ຜິດພາດ",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "ການເຊື່ອມຕໍ່ຜິດພາດ",
+ "errorSocket": "Web socket connection error",
+ "errorZero": "Can't be zero",
+ "userEmail": "ອີເມວ",
+ "userPassword": "ລະຫັດຜ່ານ",
+ "userAdmin": "ຜູ້ເບິ່ງແຍງລະບົບ",
+ "userRemember": "ຈື່ໄວ້",
+ "userExpirationTime": "Expiration",
+ "userDeviceLimit": "Device Limit",
+ "userUserLimit": "User Limit",
+ "userDeviceReadonly": "Device Readonly",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "ເຂົ້າສູ່ລະບົບ",
+ "loginLanguage": "ພາສາ",
+ "loginReset": "Reset Password",
+ "loginRegister": "ລົງທະບຽນ",
+ "loginLogin": "ເຂົ້າສູ່ລະບົບ",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "ທີ່ຢູ່ອີເມວຫລືລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ",
+ "loginCreated": "ຜູ້ໃຊ້ໃຫມ່ ໄດ້ຮັບການລົງທະບຽນ",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "ອອກຈາກລະບົບ",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "ອຸປະກອນແລະສະຖານະ",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "ເຄື່ອງ/ອຸປະກອນ",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "ລະບຸເລກອຸປະກອນ",
+ "deviceModel": "Model",
+ "deviceContact": "Contact",
+ "deviceCategory": "Category",
+ "deviceLastUpdate": "ແກ້ໄຂລ່າສຸດ",
+ "deviceCommand": "ຄຳສັ່ງ",
+ "deviceFollow": "ຕິດຕາມ",
+ "deviceTotalDistance": "Total Distance",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Unknown",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "ກຸ່ມ",
+ "groupParent": "ກຸ່ມ",
+ "groupNoGroup": "ບໍ່ຈັດໃນກຸ່ມ",
+ "settingsTitle": "ການຕັ້ງຄ່າ",
+ "settingsUser": "ບັນຊີຜູ້ໃຊ້",
+ "settingsGroups": "ຕັ້ງຄ່າກຸ່ມ",
+ "settingsServer": "ຕັ້ງຄ່າລະບົບ",
+ "settingsUsers": "ຕັ້ງຄ່າຜູ້ໃຊ້ງານ",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "ຮູບແບບເວລາ 12 ຊົ່ວໂມງ",
+ "settingsCoordinateFormat": "Coordinates Format",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "ລາຍງານ",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "ລາຍງານເຄື່ອງ/ອຸປະກອນ",
+ "reportGroup": "Group",
+ "reportFrom": "ຈາກ",
+ "reportTo": "ໄປເຖິງ",
+ "reportShow": "ສະແດງ",
+ "reportClear": "ລົບລ້າງລາຍງານ",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "ຖືກຕ້ອງ",
+ "positionAccuracy": "Accuracy",
+ "positionLatitude": "ລາຕິຈູດ",
+ "positionLongitude": "ລອງຈິຈູດ",
+ "positionAltitude": "ລະດັບຄວາມສູງ",
+ "positionSpeed": "ຄວາມໄວ",
+ "positionCourse": "ທິດທາງ",
+ "positionAddress": "ທີ່ຢູ່",
+ "positionProtocol": "ໂປຣໂຕຄໍລ໌",
+ "positionDistance": "Distance",
+ "positionRpm": "RPM",
+ "positionFuel": "Fuel",
+ "positionPower": "Power",
+ "positionBattery": "Battery",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Event",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hours",
+ "positionSteps": "Steps",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Battery Level",
+ "positionFuelConsumption": "Fuel Consumption",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Ignition",
+ "positionFlags": "Flags",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Motion",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Device Temperature",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Command",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "ການຕັ້ງຄ່າເຊີເວີ້",
+ "serverZoom": "ຂະຫຍາຍ +/-",
+ "serverRegistration": "ລົງທະບຽນ",
+ "serverReadonly": "ອ່ານໄດ້ຢ່າງດຽວ",
+ "serverForceSettings": "Force Settings",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "ແຜ່ນທີ",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "ຊັ້ນແຜ່ນທີ",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps ສຳຄັນ",
+ "mapBingRoad": "Bing Maps ຖະຫນົນ",
+ "mapBingAerial": "Bing Maps ທາງອາກາດ",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "ໂພລີກອນ",
+ "mapShapeCircle": "ວົງກົມ",
+ "mapShapePolyline": "Polyline",
+ "mapLiveRoutes": "Live Routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "ສະຖານະ",
+ "stateName": "ຄຸນລັກສະນະ",
+ "stateValue": "ມູນຄ່າ",
+ "commandTitle": "ຄຳສັ່ງ",
+ "commandSend": "ສົ່ງ",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "ຫນ່ວຍ",
+ "commandCustom": "ຄຳສັ່ງກຳຫນົດເອງ",
+ "commandDeviceIdentification": "ໝາຍເລກອຸປະກອນ",
+ "commandPositionSingle": "ລາຍງານຕ່ຳແຫນ່ງດຽວ",
+ "commandPositionPeriodic": "ແກ້ໄຂຕ່ຳແຫນ່ງ",
+ "commandPositionStop": "ຕ່ຳແຫນ່ງ ຢຸດ",
+ "commandEngineStop": "ດັບເຄື່ອງຈັກ",
+ "commandEngineResume": "ຕິດເຄື່ອງຈັກຄືນໃຫມ່",
+ "commandAlarmArm": "ແຈ້ງເຕືອນຕິດຕໍ່ສາຂາ",
+ "commandAlarmDisarm": "ແຈ້ງເຕືອນຍົກເລີກຕິດຕໍ່ສາຂາ",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "ຕັ້ງຄ່າເຂດເວລາ",
+ "commandRequestPhoto": "ສັ່ງຖ່າຍຮູບ",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "ຣີບູດ",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "ສົ່ງ SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "ຕັ້ງຄ່າເລກໝາຍໂທສຸກເສີນ SOS",
+ "commandSilenceTime": "ຕັ້ງຄ່າຊ່ວງເວລາຢຸດນິ່ງ",
+ "commandSetPhonebook": "ຕັ້ງຄ່າສະໝຸດໂທລະສັບ",
+ "commandVoiceMessage": "ຂໍ້ຄວາມສຽງ",
+ "commandOutputControl": "ຄວບຄຸມຂໍ້ມູນທີ່ສົ່ງອອກ",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Set Indicator",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "ຄວາມຖີ່",
+ "commandTimezone": "Timezone Offset",
+ "commandMessage": "Message",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Data",
+ "commandIndex": "Index",
+ "commandPhone": "Phone Number",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "All Events",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "ຜົນຮັບຈາກຄຳສັ່ງ",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Maintenance required",
+ "eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "ຊະນິດການແຈ້ງເຕືອນ",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Route",
+ "reportEvents": "Events",
+ "reportTrips": "Trips",
+ "reportStops": "Stops",
+ "reportSummary": "Summary",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Chart",
+ "reportConfigure": "Configure",
+ "reportEventTypes": "Event Types",
+ "reportChartType": "Chart Type",
+ "reportShowMarkers": "Show Markers",
+ "reportExport": "Export",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "Device Name",
+ "reportAverageSpeed": "Average Speed",
+ "reportMaximumSpeed": "Maximum Speed",
+ "reportEngineHours": "Engine Hours",
+ "reportDuration": "Duration",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Start Time",
+ "reportStartAddress": "Start Address",
+ "reportEndTime": "End Time",
+ "reportEndAddress": "End Address",
+ "reportSpentFuel": "Spent Fuel",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Statistics",
+ "statisticsCaptureTime": "Capture Time",
+ "statisticsActiveUsers": "Active Users",
+ "statisticsActiveDevices": "Active Devices",
+ "statisticsRequests": "Requests",
+ "statisticsMessagesReceived": "Messages Received",
+ "statisticsMessagesStored": "Messages Stored",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Arrow",
+ "categoryDefault": "Default",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicycle",
+ "categoryBoat": "Boat",
+ "categoryBus": "Bus",
+ "categoryCar": "Car",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "Motorcycle",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Plane",
+ "categoryShip": "Ship",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Truck",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/lt.json b/legacy/web/l10n/lt.json
new file mode 100644
index 00000000..d4ae0530
--- /dev/null
+++ b/legacy/web/l10n/lt.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Kraunasi..",
+ "sharedHide": "Paslėpti",
+ "sharedSave": "Išsaugoti",
+ "sharedUpload": "Įkelti",
+ "sharedSet": "Nustatyti",
+ "sharedCancel": "Atšaukti",
+ "sharedCopy": "Kopijuoti",
+ "sharedAdd": "Pridėti",
+ "sharedEdit": "Redaguoti",
+ "sharedRemove": "Pašalinti",
+ "sharedRemoveConfirm": "Pašalinti objektą?",
+ "sharedNoData": "Nėra duomenų",
+ "sharedSubject": "Subject",
+ "sharedYes": "Taip",
+ "sharedNo": "Ne",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "jurmylė",
+ "sharedMeters": "m",
+ "sharedFeet": "pėdos",
+ "sharedKn": "mazgai",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Valanda(-os)",
+ "sharedMinute": "Minutė(-es)",
+ "sharedSecond": "Sekundė(-es)",
+ "sharedDays": "dienos",
+ "sharedHours": "valandos",
+ "sharedMinutes": "minutės",
+ "sharedDecimalDegrees": "Laipsniai ir jų dalys",
+ "sharedDegreesDecimalMinutes": "Laipsniai minutės ir jų dalys",
+ "sharedDegreesMinutesSeconds": "Laipsniai minutės sekundės",
+ "sharedName": "Pavadinimas",
+ "sharedDescription": "Aprašymas",
+ "sharedSearch": "Paieška",
+ "sharedIconScale": "Ikonos mastelis",
+ "sharedGeofence": "Georiba",
+ "sharedGeofences": "Georibos",
+ "sharedCreateGeofence": "Sukurti Georibas",
+ "sharedNotifications": "Perspėjimai",
+ "sharedNotification": "Pranešimas",
+ "sharedAttributes": "Parametrai",
+ "sharedAttribute": "Parametras",
+ "sharedDrivers": "Vairuotojai",
+ "sharedDriver": "Vairuotojas",
+ "sharedArea": "Plotas",
+ "sharedSound": "Perspėjimo garsas",
+ "sharedType": "Tipas",
+ "sharedDistance": "Atstumas",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "I",
+ "sharedGallonAbbreviation": "galonas",
+ "sharedLiter": "Litras",
+ "sharedImpGallon": "Standartinis galonas",
+ "sharedUsGallon": "JAV galonas",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Gauti žemėlapio buseną",
+ "sharedComputedAttribute": "Apskaičiuotas parametras",
+ "sharedComputedAttributes": "Apskaičiuoti parametrai",
+ "sharedCheckComputedAttribute": "Patikrinti apskaičiuotą parametrą",
+ "sharedExpression": "Išraiška",
+ "sharedDevice": "Prietaisas",
+ "sharedTest": "Testas",
+ "sharedTestNotification": "Siųsti bandomąjį perspėjimą",
+ "sharedTestNotificators": "Bandyti kanalus",
+ "sharedTestExpression": "Bandyti reikšmę",
+ "sharedCalendar": "Kalendorius",
+ "sharedCalendars": "Kalendoriai",
+ "sharedFile": "Failas",
+ "sharedSearchDevices": "Ieškoti įrenginių",
+ "sharedSortBy": "Rūšiuoti pagal",
+ "sharedFilterMap": "Filtruoti žemėlapyje",
+ "sharedSelectFile": "Parinkite failą",
+ "sharedPhone": "Telefonas",
+ "sharedRequired": "Privalomas",
+ "sharedPreferences": "Pasirinkimai",
+ "sharedPermissions": "Leidimai",
+ "sharedConnections": "Susijungimai",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Pagrindinis",
+ "sharedSecondary": "Antrinis",
+ "sharedTypeString": "Tekstas",
+ "sharedTypeNumber": "Skaičius",
+ "sharedTypeBoolean": "Loginis",
+ "sharedTimezone": "Laiko zona",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Išsaugota komanda",
+ "sharedSavedCommands": "Išsaugotos komandos",
+ "sharedNew": "Naujas...",
+ "sharedShowAddress": "Rodyti adresą",
+ "sharedShowDetails": "Daugiau informacijos",
+ "sharedDisabled": "Išjungtas",
+ "sharedMaintenance": "Aptarnavimas",
+ "sharedDeviceAccumulators": "Akumuliatorius",
+ "sharedAlarms": "Perspėjimai",
+ "sharedLocation": "Lokacija",
+ "sharedImport": "Importuoti",
+ "sharedColumns": "Stulpeliai",
+ "sharedDropzoneText": "Nutempkite failą čia arba paspauskite",
+ "sharedLogs": "Žurnalai",
+ "sharedLink": "Link",
+ "calendarSimple": "Paprastas",
+ "calendarRecurrence": "Pasikartojimas",
+ "calendarOnce": "Vienkartinis",
+ "calendarDaily": "Kasdien",
+ "calendarWeekly": "Savaitinis",
+ "calendarMonthly": "Mėnesinis",
+ "calendarDays": "Dienos",
+ "calendarSunday": "Sekmadienis",
+ "calendarMonday": "Pirmadienis",
+ "calendarTuesday": "Antradienis",
+ "calendarWednesday": "Trečiadienis",
+ "calendarThursday": "Ketvirtadienis",
+ "calendarFriday": "Penktadienis",
+ "calendarSaturday": "Šeštadienis",
+ "attributeShowGeofences": "Rodyti Georibas",
+ "attributeSpeedLimit": "Greičio limitas",
+ "attributeFuelDropThreshold": "Kuro mažėjimo riba",
+ "attributeFuelIncreaseThreshold": "Kuro didėjimo riba",
+ "attributePolylineDistance": "Linijos atstumas",
+ "attributeReportIgnoreOdometer": "Ataskaita: Ignoruoti odometrą",
+ "attributeWebReportColor": "Web: Ataskaitos spalva",
+ "attributeDevicePassword": "Įrenginio slaptažodis",
+ "attributeDeviceImage": "Įrenginio vaizdas",
+ "attributeDeviceInactivityStart": "Įrenginio neaktyvumo pradžia",
+ "attributeDeviceInactivityPeriod": "Įrenginio neaktyvumo trukmė",
+ "attributeProcessingCopyAttributes": "Apdorojimas: Kopijuoti atributus",
+ "attributeColor": "Spalva",
+ "attributeWebLiveRouteLength": "Web: Tiesioginio maršruto ilgis",
+ "attributeWebSelectZoom": "Web: Išdidinti pažymėjus",
+ "attributeWebMaxZoom": "Web: Maximalus išdidinimas",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP adresas",
+ "attributeMailSmtpPort": "Mail: SMTP prievadas",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS įjungtas",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTLS privalomas",
+ "attributeMailSmtpSslEnable": "Mail: SMTP SSL įjungtas",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL protokolai",
+ "attributeMailSmtpFrom": "Mail: SMTP Siuntėjas",
+ "attributeMailSmtpAuth": "Mail: SMTP autentifikacija įjungta",
+ "attributeMailSmtpUsername": "Mail: SMTP prisijungimas",
+ "attributeMailSmtpPassword": "Mail: SMTP slaptažodis",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: išjungti atributus",
+ "attributeUiDisableGroups": "UI: išjungti grupes",
+ "attributeUiDisableEvents": "UI: Išjungti įvykius",
+ "attributeUiDisableVehicleFeatures": "UI: Išjungti automobilio funkcijas",
+ "attributeUiDisableDrivers": "UI: Išjungti vairuotojus",
+ "attributeUiDisableComputedAttributes": "UI: Išjungti apskaičiuotus parametrus",
+ "attributeUiDisableCalendars": "UI: Išjungti kalendorius",
+ "attributeUiDisableMaintenance": "UI: Išjungti aptarnavimus",
+ "attributeUiHidePositionAttributes": "UI: Slėpti pozicijos adresą",
+ "attributeUiDisableLoginLanguage": "UI: Išjungti prisijungimo kalbą",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Klaida",
+ "errorGeneral": "Netinkami parametrai ar apribojimų pažeidimas",
+ "errorConnection": "Ryšio klaida",
+ "errorSocket": "Web socket prisijungimo klaida",
+ "errorZero": "Negali būti nulis",
+ "userEmail": "Vartotojo vardas",
+ "userPassword": "Slaptažodis",
+ "userAdmin": "Administratorius",
+ "userRemember": "Prisiminti",
+ "userExpirationTime": "Galiojimas",
+ "userDeviceLimit": "Prietaiso limitas",
+ "userUserLimit": "Vartotojo limitas",
+ "userDeviceReadonly": "Prietaisai skaitymo rėžimu",
+ "userLimitCommands": "Apriboti komandas",
+ "userDisableReports": "Išjungti ataskaitas",
+ "userFixedEmail": "Neleisti keisti Email",
+ "userToken": "Token",
+ "userDeleteAccount": "Pašalinti vartotoją",
+ "userTemporary": "Temporary",
+ "loginTitle": "Prisijungimas",
+ "loginLanguage": "Kalba",
+ "loginReset": "Atstatyti slaptažodį",
+ "loginRegister": "Registruotis",
+ "loginLogin": "Prisijungti",
+ "loginOpenId": "Jungtis naudojant Google",
+ "loginFailed": "Neteisingas el.paštas ir/ar slaptažodis",
+ "loginCreated": "Registracija sėkminga",
+ "loginResetSuccess": "Patikrinkite savo el. paštą",
+ "loginUpdateSuccess": "Naujas slaptažodis sukurtas",
+ "loginLogout": "Atsijungti",
+ "loginLogo": "Logotipas",
+ "loginTotpCode": "Vienkartinio slaptažodžio kodas",
+ "loginTotpKey": "Vienkartinio slaptažodžio raktas",
+ "devicesAndState": "Prietaisai ir Statusas",
+ "deviceSelected": "Pasirinktas įrenginys",
+ "deviceTitle": "Prietaisai",
+ "devicePrimaryInfo": "Įrenginio antraštė",
+ "deviceSecondaryInfo": "Įrenginio aprašymas",
+ "deviceIdentifier": "Identifikacinis kodas",
+ "deviceModel": "Modelis",
+ "deviceContact": "Kontaktas",
+ "deviceCategory": "Kategorija",
+ "deviceLastUpdate": "Naujausias atnaujinimas",
+ "deviceCommand": "Komanda",
+ "deviceFollow": "Sekti",
+ "deviceTotalDistance": "Viso distancija",
+ "deviceStatus": "Būsena",
+ "deviceStatusOnline": "Prisijungęs",
+ "deviceStatusOffline": "Neprisijungęs",
+ "deviceStatusUnknown": "Nežinoma",
+ "deviceRegisterFirst": "Registruokite savo pirmą įrenginį",
+ "deviceIdentifierHelp": "IMEI, serijinis numeris arba identifikacinis ID. Turi atitikti įrenginio ID siunčiamą į serverį.",
+ "deviceShare": "Dalintis įrenginiu",
+ "groupDialog": "Grupė",
+ "groupParent": "Grupė",
+ "groupNoGroup": "Nenurodyta grupė",
+ "settingsTitle": "Nustatymai",
+ "settingsUser": "Paskyra",
+ "settingsGroups": "Grupės",
+ "settingsServer": "Serveris",
+ "settingsUsers": "Vartotojai",
+ "settingsDistanceUnit": "Atstumo vienetai",
+ "settingsAltitudeUnit": "Aukščio vienetai",
+ "settingsSpeedUnit": "Greičio vienetai",
+ "settingsVolumeUnit": "Tūrio vienetai",
+ "settingsTwelveHourFormat": "12-val formatas",
+ "settingsCoordinateFormat": "Koordinačių formatas",
+ "settingsServerVersion": "Serverio versija",
+ "settingsAppVersion": "App versija",
+ "settingsConnection": "Susijungimas",
+ "settingsDarkMode": "Tamsi tema",
+ "settingsTotpEnable": "Įjungti vienkartinį slaptažodį",
+ "settingsTotpForce": "Priverstinis vienkartinis slaptažodis",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker atnaujinimo intervalas",
+ "settingsUpdateAvailable": "Yra atnaujinimas.",
+ "settingsSupport": "Pagalba",
+ "reportTitle": "Ataskaitos",
+ "reportScheduled": "Suplanuotos ataskaitos",
+ "reportDevice": "Prietaisas",
+ "reportGroup": "Grupė",
+ "reportFrom": "Nuo",
+ "reportTo": "Iki",
+ "reportShow": "Rodyti",
+ "reportClear": "Valyti",
+ "linkGoogleMaps": "Google žemėlapiai",
+ "linkAppleMaps": "Apple žemėlapiai",
+ "linkStreetView": "Gatvės vaizdas",
+ "positionFixTime": "Fiksuoti laiką",
+ "positionDeviceTime": "Įrenginio laikas",
+ "positionServerTime": "Serverio laikas",
+ "positionValid": "Galiojantis",
+ "positionAccuracy": "Tikslumas",
+ "positionLatitude": "Platuma",
+ "positionLongitude": "Ilguma",
+ "positionAltitude": "Aukštis",
+ "positionSpeed": "Greitis",
+ "positionCourse": "Kryptis",
+ "positionAddress": "Adresas",
+ "positionProtocol": "Protokolas",
+ "positionDistance": "Atstumas",
+ "positionRpm": "APM",
+ "positionFuel": "Kuras",
+ "positionPower": "Energija",
+ "positionBattery": "Baterija",
+ "positionRaw": "Neapdoroti duomenys",
+ "positionIndex": "Indeksas",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Palydovai",
+ "positionSatVisible": "Matomi palydovai",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Tarptinklinis ryšys",
+ "positionEvent": "Įvykis",
+ "positionAlarm": "Signalas",
+ "positionStatus": "Būsena",
+ "positionOdometer": "Odometras",
+ "positionServiceOdometer": "Serviso odometras",
+ "positionTripOdometer": "Kelionės odometras",
+ "positionHours": "Valandos",
+ "positionSteps": "Žingsniai",
+ "positionInput": "Įvestis",
+ "positionHeartRate": "Pulsas",
+ "positionOutput": "Išvestis",
+ "positionBatteryLevel": "Baterijos lygis",
+ "positionFuelConsumption": "Kuro suvartojimas",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Programinės įrangos versija",
+ "positionVersionHw": "Techninės įrangos versija",
+ "positionIgnition": "Degimas",
+ "positionFlags": "Žymeklis",
+ "positionCharge": "Krovimas",
+ "positionIp": "IP",
+ "positionArchive": "Archyvas",
+ "positionVin": "VIN",
+ "positionApproximate": "Apytikslis",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Judantis",
+ "positionArmed": "Uždėtas",
+ "positionAcceleration": "Akseleracija",
+ "positionTemp": "Temperatūra",
+ "positionDeviceTemp": "Įrenginio temperatūra",
+ "positionCoolantTemp": "Aušinimo temperatūra",
+ "positionOperator": "Operatorius",
+ "positionCommand": "Komanda",
+ "positionBlocked": "Užblokuotas",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD greitis",
+ "positionObdOdometer": "OBD odometras",
+ "positionDrivingTime": "Vairavimo laikas",
+ "positionDriverUniqueId": "Vairuotojo unikalus ID",
+ "positionCard": "Kortelė",
+ "positionImage": "Atvaizdas",
+ "positionVideo": "Vaizdo įrašas",
+ "positionAudio": "Garso įrašas",
+ "serverTitle": "Serverio nustatymai",
+ "serverZoom": "Priartinimas",
+ "serverRegistration": "Registracija",
+ "serverReadonly": "Skaitymo",
+ "serverForceSettings": "Priverstiniai nustatymai",
+ "serverAnnouncement": "Pranešimai",
+ "serverName": "Serverio pavadinimas",
+ "serverDescription": "Serverio aprašymas",
+ "serverColorPrimary": "Pirminė spalva",
+ "serverColorSecondary": "Papildoma spalva",
+ "serverLogo": "Logo vaizdas",
+ "serverLogoInverted": "Invertuotas logo vaizdas",
+ "serverChangeDisable": "Uždrausti keisti serverį",
+ "serverDisableShare": "Išjungti dalinimasi įrenginiais",
+ "mapTitle": "Žemėlapis",
+ "mapActive": "Aktyvūs žemėlapiai",
+ "mapOverlay": "Žemėlapių sluoksniai",
+ "mapOverlayCustom": "Pasirinkti sluoksnį",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API raktas",
+ "mapOpenWeatherClouds": "OpenWeather debesuotumas",
+ "mapOpenWeatherPrecipitation": "OpenWeather krituliai",
+ "mapOpenWeatherPressure": "OpenWeather slėgis",
+ "mapOpenWeatherWind": "OpenWeather vėjas",
+ "mapOpenWeatherTemperature": "OpenWeather temperatūra",
+ "mapLayer": "Žemėlapio sluoksnis",
+ "mapCustom": "Pasirinkti (XYZ)",
+ "mapCustomArcgis": "Pasirinkti (ArcGIS)",
+ "mapCustomLabel": "Pasirinkti žemėlapį",
+ "mapCarto": "Carto žemėlapiai",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google keliai",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps raktas",
+ "mapBingRoad": "Bing Maps Keliai",
+ "mapBingAerial": "Bing Maps Palydovas",
+ "mapBingHybrid": "Bing Maps Mišrus",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex žemėlapis",
+ "mapYandexSat": "Yandex Palydovinis",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox gatvės",
+ "mapMapboxStreetsDark": "Tamsus Mapbox Streets",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Palydovinis",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API raktas",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom eismo įvykiai",
+ "mapTomTomKey": "TomTom API raktas",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API raktas",
+ "mapShapePolygon": "Polygonas",
+ "mapShapeCircle": "Apskritimas",
+ "mapShapePolyline": "Polilinija",
+ "mapLiveRoutes": "Tiesioginiai maršrutai",
+ "mapDirection": "Rodyti kryptį",
+ "mapCurrentLocation": "Esama pozicija",
+ "mapPoiLayer": "Lankytinų vietų sluoksnis",
+ "mapClustering": "Žymų grupavimas",
+ "mapOnSelect": "Rodyti žemėlapį pažymėjus",
+ "mapDefault": "Pagrindinis žemėlapis",
+ "stateTitle": "Būklė",
+ "stateName": "Parametras",
+ "stateValue": "Reikšmė",
+ "commandTitle": "Komanda",
+ "commandSend": "Siųsti",
+ "commandSent": "Komanda nusiųsta",
+ "commandQueued": "Komanda eilėje",
+ "commandUnit": "Vienetas",
+ "commandCustom": "Vartotojo komanda",
+ "commandDeviceIdentification": "Įrenginio identifikacija",
+ "commandPositionSingle": "Vienkartinė ataskaita",
+ "commandPositionPeriodic": "Periodinės ataskaitos",
+ "commandPositionStop": "Stabdyti ataskaitas",
+ "commandEngineStop": "Stabdyti variklį",
+ "commandEngineResume": "Paleisti variklį",
+ "commandAlarmArm": "Uždėti signalą",
+ "commandAlarmDisarm": "Nuimti signalą",
+ "commandAlarmDismiss": "Nutraukti signalą",
+ "commandSetTimezone": "Nustatyti laiko zoną",
+ "commandRequestPhoto": "Gauti nuotrauką",
+ "commandPowerOff": "Išjungti įrenginį",
+ "commandRebootDevice": "Perkrauti įrenginį",
+ "commandFactoryReset": "Gamykliniai nustatymai",
+ "commandSendSms": "Siųsti SMS",
+ "commandSendUssd": "Siųsti USSD",
+ "commandSosNumber": "Nustatyti SOS numerį",
+ "commandSilenceTime": "Nustatyti tylos laiką",
+ "commandSetPhonebook": "Nustatyti adresatų knygą",
+ "commandVoiceMessage": "Balso žinutė",
+ "commandOutputControl": "Įšvesties kontrolė",
+ "commandVoiceMonitoring": "Balso stebėjimas",
+ "commandSetAgps": "Nustatyti A-GPS",
+ "commandSetIndicator": "Nustatyti Indikatorių",
+ "commandConfiguration": "Konfigūracija",
+ "commandGetVersion": "Gauti versiją",
+ "commandFirmwareUpdate": "Atnaujinti programinę įrangą",
+ "commandSetConnection": "Nustatyti prisijungimą",
+ "commandSetOdometer": "Nustatyti odometrą",
+ "commandGetModemStatus": "Gauti modemo būseną",
+ "commandGetDeviceStatus": "Gauti įrenginio būseną",
+ "commandSetSpeedLimit": "Nustatyti greičio limitą",
+ "commandModePowerSaving": "Energijos taupymo režimas",
+ "commandModeDeepSleep": "\"Užmigdyti\" įrenginį",
+ "commandAlarmGeofence": "Nustatyti georibos signalą",
+ "commandAlarmBattery": "Nustatyti baterijos signalą",
+ "commandAlarmSos": "Nustatyti SOS signalą",
+ "commandAlarmRemove": "Nustatyti pašalinimo signalą",
+ "commandAlarmClock": "Nustatyti laiko signalą",
+ "commandAlarmSpeed": "Nustatyti greičio signalą",
+ "commandAlarmFall": "Nustatyti kritimo signalą",
+ "commandAlarmVibration": "Nustatyti vibravimo signalą",
+ "commandFrequency": "Dažnis",
+ "commandTimezone": "Laiko zonos pataisa",
+ "commandMessage": "Žinutė",
+ "commandRadius": "Spindulys",
+ "commandEnable": "Įgalinti",
+ "commandData": "Duomenys",
+ "commandIndex": "Indeksas",
+ "commandPhone": "Telefono numeris",
+ "commandServer": "Serveris",
+ "commandPort": "Prievadas",
+ "eventAll": "Visi įvykiai",
+ "eventDeviceOnline": "Būsena pasiekiamas",
+ "eventDeviceUnknown": "Būsena nežinoma",
+ "eventDeviceOffline": "Būsena atsijungęs",
+ "eventDeviceInactive": "Įrenginys neaktyvus",
+ "eventQueuedCommandSent": "Išsiųsta komanda eilėje",
+ "eventDeviceMoving": "Įrenginys juda",
+ "eventDeviceStopped": "Įrenginys sustojo",
+ "eventDeviceOverspeed": "Greičio limitas viršytas",
+ "eventDeviceFuelDrop": "Kuras sumažėjo",
+ "eventDeviceFuelIncrease": "Kuras papildytas",
+ "eventCommandResult": "Komandos rezultatas",
+ "eventGeofenceEnter": "Georibų viduje",
+ "eventGeofenceExit": "Už georibų",
+ "eventAlarm": "Signalas",
+ "eventIgnitionOn": "Degimas įjungtas",
+ "eventIgnitionOff": "Degimas išjungtas",
+ "eventMaintenance": "Aptarnavimo poreikis",
+ "eventTextMessage": "Gauta tekstinė žinutė",
+ "eventDriverChanged": "Vairuotojas pasikeitė",
+ "eventMedia": "Medija",
+ "eventsScrollToLast": "Slinkti iki paskutinio",
+ "eventsSoundEvents": "Garso įvykiai",
+ "eventsSoundAlarms": "Garso signalai",
+ "alarmGeneral": "Pagrindinis",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibracija",
+ "alarmMovement": "Judėjimas",
+ "alarmLowspeed": "Mažas greitis",
+ "alarmOverspeed": "Greičio viršijimas",
+ "alarmFallDown": "Nukrito",
+ "alarmLowPower": "Žema įtampa",
+ "alarmLowBattery": "Mažas baterijos lygis",
+ "alarmFault": "Klaida",
+ "alarmPowerOff": "Išjungtas",
+ "alarmPowerOn": "Įjungtas",
+ "alarmDoor": "Durys",
+ "alarmLock": "Užrakinta",
+ "alarmUnlock": "Atrakinta",
+ "alarmGeofence": "Georiba",
+ "alarmGeofenceEnter": "Georiba įeiti",
+ "alarmGeofenceExit": "Georiba išeiti",
+ "alarmGpsAntennaCut": "GPS antena nutraukta",
+ "alarmAccident": "Įvykis",
+ "alarmTow": "Vilkimas",
+ "alarmIdle": "Tuščia eiga",
+ "alarmHighRpm": "Aukštos apsukos",
+ "alarmHardAcceleration": "Didelis pagreitis",
+ "alarmHardBraking": "Staigus stabdymas",
+ "alarmHardCornering": "Staigus posūkis",
+ "alarmLaneChange": "Juostų keitimas",
+ "alarmFatigueDriving": "Nuovargis",
+ "alarmPowerCut": "Atjungtas maitinimas",
+ "alarmPowerRestored": "Maitinimas atstatytas",
+ "alarmJamming": "Kamštis",
+ "alarmTemperature": "Temperatūra",
+ "alarmParking": "Parkavimas",
+ "alarmBonnet": "Variklio dangtis",
+ "alarmFootBrake": "Pertrauka maistui",
+ "alarmFuelLeak": "Kuro nuotekis",
+ "alarmTampering": "Gadinimas",
+ "alarmRemoving": "Pašalinimas",
+ "notificationType": "Įspėjimo tipas",
+ "notificationAlways": "Visi prietaisai",
+ "notificationNotificators": "Kanalai",
+ "notificatorCommand": "Komanda",
+ "notificatorWeb": "Web",
+ "notificatorMail": "El. paštas",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Pakartoti",
+ "reportCombined": "Sujungta",
+ "reportRoute": "Maršrutas",
+ "reportEvents": "Įvykiai",
+ "reportTrips": "Kelionės",
+ "reportStops": "Sustojimai",
+ "reportSummary": "Suvestinė",
+ "reportDaily": "Dienos suvestinė",
+ "reportChart": "Diagrama",
+ "reportConfigure": "Konfigūruoti",
+ "reportEventTypes": "Įvykių tipai",
+ "reportChartType": "Diagramų tipai",
+ "reportShowMarkers": "Rodyti žymeklius",
+ "reportExport": "Eksportuoti",
+ "reportEmail": "Ataskaitą siųsti el. paštu",
+ "reportSchedule": "Planuoti",
+ "reportPeriod": "Periodas",
+ "reportCustom": "Custom",
+ "reportToday": "Šiandien",
+ "reportYesterday": "Vakar",
+ "reportThisWeek": "Šią savaitę",
+ "reportPreviousWeek": "Praėjusią savaitę",
+ "reportThisMonth": "Šį mėnesį",
+ "reportPreviousMonth": "Praėjusį mėnesį",
+ "reportDeviceName": "Prietaiso vardas",
+ "reportAverageSpeed": "Vidutinis greitis",
+ "reportMaximumSpeed": "Maksimalus greitis",
+ "reportEngineHours": "Variklio valandos",
+ "reportDuration": "Trukmė",
+ "reportStartDate": "Pradžios data",
+ "reportStartTime": "Pradžios laikas",
+ "reportStartAddress": "Pradžios adresas",
+ "reportEndTime": "Pabaigos laikas",
+ "reportEndAddress": "Pabaigos adresas",
+ "reportSpentFuel": "Suvartoto kuro",
+ "reportStartOdometer": "Odometras startas",
+ "reportEndOdometer": "Odometras pabaiga",
+ "statisticsTitle": "Statistika",
+ "statisticsCaptureTime": "Užfiksuotas laikas",
+ "statisticsActiveUsers": "Aktyvus vartotojai",
+ "statisticsActiveDevices": "Aktyvūs prietaisai",
+ "statisticsRequests": "Prašymai",
+ "statisticsMessagesReceived": "Žinutė gauta",
+ "statisticsMessagesStored": "Žinutė išsaugota",
+ "statisticsGeocoder": "Geokoderio užklausos",
+ "statisticsGeolocation": "Geolokacijos užklausos",
+ "categoryArrow": "Rodyklė",
+ "categoryDefault": "Numatytas",
+ "categoryAnimal": "Gyvūnas",
+ "categoryBicycle": "Dviratis",
+ "categoryBoat": "Valtis",
+ "categoryBus": "Autobusas",
+ "categoryCar": "Automobilis",
+ "categoryCamper": "Kemperis",
+ "categoryCrane": "Kranas",
+ "categoryHelicopter": "Sraigtasparnis",
+ "categoryMotorcycle": "Motociklas",
+ "categoryOffroad": "Bekelės transportas",
+ "categoryPerson": "Asmuo",
+ "categoryPickup": "Pikapas",
+ "categoryPlane": "Lėktuvas",
+ "categoryShip": "Laivas",
+ "categoryTractor": "Traktorius",
+ "categoryTrain": "Traukinys",
+ "categoryTram": "Tramvajus",
+ "categoryTrolleybus": "Troleibusas",
+ "categoryTruck": "Vilkikas",
+ "categoryVan": "Autobusiuskas",
+ "categoryScooter": "Mopedas",
+ "maintenanceStart": "Pradėti",
+ "maintenancePeriod": "Periodas"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/lv.json b/legacy/web/l10n/lv.json
new file mode 100644
index 00000000..5769fe30
--- /dev/null
+++ b/legacy/web/l10n/lv.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Ielādē...",
+ "sharedHide": "Paslēpt",
+ "sharedSave": "Saglabāt",
+ "sharedUpload": "Upload",
+ "sharedSet": "Iestatīt",
+ "sharedCancel": "Atcelt",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Pievienot",
+ "sharedEdit": "Rediģēt",
+ "sharedRemove": "Dzēst",
+ "sharedRemoveConfirm": "Izdzēst?",
+ "sharedNoData": "Nav datu",
+ "sharedSubject": "Subject",
+ "sharedYes": "Jā",
+ "sharedNo": "Nē",
+ "sharedKm": "km",
+ "sharedMi": "jū",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Stunda",
+ "sharedMinute": "Minūte",
+ "sharedSecond": "Sekunde",
+ "sharedDays": "dienas",
+ "sharedHours": "stundas",
+ "sharedMinutes": "minūtes",
+ "sharedDecimalDegrees": "Decimāldaļas",
+ "sharedDegreesDecimalMinutes": "Decimālgrādu minūtes",
+ "sharedDegreesMinutesSeconds": "Decimālgrādu sekundes",
+ "sharedName": "Vārds",
+ "sharedDescription": "Apraksts",
+ "sharedSearch": "Meklēt",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geolaukums",
+ "sharedGeofences": "Geolaukumi",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Paziņojumi",
+ "sharedNotification": "Paziņojums",
+ "sharedAttributes": "Vērtības",
+ "sharedAttribute": "Vērtība",
+ "sharedDrivers": "Vadītāji",
+ "sharedDriver": "Vadītājs",
+ "sharedArea": "Laukums",
+ "sharedSound": "Paziņojuma skaņa",
+ "sharedType": "Tips",
+ "sharedDistance": "Attālums",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Litri",
+ "sharedImpGallon": "Imperiālie galoni",
+ "sharedUsGallon": "ASV galoni",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Saņemt kartes stāvokli",
+ "sharedComputedAttribute": "Aprēķināmās vērtības",
+ "sharedComputedAttributes": "Aprēķinātās vērtības",
+ "sharedCheckComputedAttribute": "Pārbaudīt aprēķinātās vērtības",
+ "sharedExpression": "Izteiksme",
+ "sharedDevice": "Ierīce",
+ "sharedTest": "Pārbaude",
+ "sharedTestNotification": "Nosūtīt testa paziņojumu",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Kalendārs",
+ "sharedCalendars": "Kalendāri",
+ "sharedFile": "Fails",
+ "sharedSearchDevices": "Meklēt ierīces",
+ "sharedSortBy": "Kārtot pēc",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Izvēlieties failu",
+ "sharedPhone": "Tālrunis",
+ "sharedRequired": "Obligāts",
+ "sharedPreferences": "Izvēlnes",
+ "sharedPermissions": "Atļaujas",
+ "sharedConnections": "Savienojumi",
+ "sharedExtra": "Ekstra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Teksts",
+ "sharedTypeNumber": "Skaitlis",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Laika zona",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Saglabatā komanda",
+ "sharedSavedCommands": "Saglabātās komandas",
+ "sharedNew": "Jauns...",
+ "sharedShowAddress": "Rādīt adresi",
+ "sharedShowDetails": "Vairāk detaļu",
+ "sharedDisabled": "Atspējots",
+ "sharedMaintenance": "Uzturēšana",
+ "sharedDeviceAccumulators": "Akumulatori",
+ "sharedAlarms": "Trauksmes",
+ "sharedLocation": "Atrašanās vieta",
+ "sharedImport": "Importēt",
+ "sharedColumns": "Kolonnas",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Ātruma ierobežojums",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Maršruta Distance",
+ "attributeReportIgnoreOdometer": "Ziņojums: Ignorēt Odometru",
+ "attributeWebReportColor": "Web: Atskaites krāsa",
+ "attributeDevicePassword": "Ierīces parole",
+ "attributeDeviceImage": "Ierīces attēls",
+ "attributeDeviceInactivityStart": "Ierīces Neaktivitātes Sākšana",
+ "attributeDeviceInactivityPeriod": "Ierīces Neaktivitātes Periods",
+ "attributeProcessingCopyAttributes": "Apstrāde: Kopē Atribūtus",
+ "attributeColor": "Krāsa",
+ "attributeWebLiveRouteLength": "Web: Reāllaika Ceļa Garums",
+ "attributeWebSelectZoom": "Web: Palielināt Iezīmēto",
+ "attributeWebMaxZoom": "Web: Maksimālais zooms",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "E-pasts: SMTP adrese ",
+ "attributeMailSmtpPort": "E-pasts: SMTP Ports",
+ "attributeMailSmtpStarttlsEnable": "E-pasts: Ieslēgt SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "E-pasts: Nepieciešams SMTP STARTTLS",
+ "attributeMailSmtpSslEnable": "E-pasts: Iespējot SMTP SSL",
+ "attributeMailSmtpSslTrust": "E-pasts: SMTP SSL Uzticams",
+ "attributeMailSmtpSslProtocols": "E-pasts: SMTP SSL Protokoli",
+ "attributeMailSmtpFrom": "E-pats: SMTP Forma",
+ "attributeMailSmtpAuth": "E-pats: SMTP Autentif. Ieslēgta",
+ "attributeMailSmtpUsername": "E-pats: SMTP Lietotājvārds",
+ "attributeMailSmtpPassword": "E-pats: SMTP Parole",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Atslēgt notikumus",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Atslēgt vadītājus",
+ "attributeUiDisableComputedAttributes": "UI: Atslēgt aprēķinātos atribūtus",
+ "attributeUiDisableCalendars": "UI: Atslēgt kalendārus",
+ "attributeUiDisableMaintenance": "UI: Atslegt Apkopi",
+ "attributeUiHidePositionAttributes": "UI: Slēpt pozīcijas atribūtus",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Paziņojumu Žetoni",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Kļūda",
+ "errorGeneral": "Kļūdaini parametri vai satur kļūdas",
+ "errorConnection": "Savienojuma kļūda",
+ "errorSocket": "Web socket savienojuma kļūda",
+ "errorZero": "Nevar būt nulle",
+ "userEmail": "E-pasts",
+ "userPassword": "Parole",
+ "userAdmin": "Administrators",
+ "userRemember": "Atcerēties",
+ "userExpirationTime": "Derīguma termiņš",
+ "userDeviceLimit": "Ierīču Limits",
+ "userUserLimit": "Lietotāju Limits",
+ "userDeviceReadonly": "Tikai lasāma ierīce",
+ "userLimitCommands": "Ierobežot komandas",
+ "userDisableReports": "Atslēgt Atskaites",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Zīme",
+ "userDeleteAccount": "Dzēst Kontu",
+ "userTemporary": "Temporary",
+ "loginTitle": "Lietotājvārds",
+ "loginLanguage": "Valoda",
+ "loginReset": "Atiestatīt paroli",
+ "loginRegister": "Reģistrēties",
+ "loginLogin": "Ieiet",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Kļūdains e-pasts vai parole",
+ "loginCreated": "Jauns lietotājs tika veiksmīgi reģistrēts ",
+ "loginResetSuccess": "Pārbaudiet savu e-pastu",
+ "loginUpdateSuccess": "Jaunā parole saglabāta",
+ "loginLogout": "Iziet",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Ierīces un to statusi",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Ierīces",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifikators",
+ "deviceModel": "Modelis",
+ "deviceContact": "Kontakti",
+ "deviceCategory": "Kategorija",
+ "deviceLastUpdate": "Pēdējā atjaunošana",
+ "deviceCommand": "Komanda",
+ "deviceFollow": "Sekojiet",
+ "deviceTotalDistance": "Kopējais attālums",
+ "deviceStatus": "Statuss",
+ "deviceStatusOnline": "Tiešsaistē",
+ "deviceStatusOffline": "Bezsaistē",
+ "deviceStatusUnknown": "Nezināms",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Grupa",
+ "groupParent": "Grupa",
+ "groupNoGroup": "Neviena grupa",
+ "settingsTitle": "Iestatījumi",
+ "settingsUser": "Konts",
+ "settingsGroups": "Grupas",
+ "settingsServer": "Server",
+ "settingsUsers": "Lietotāji",
+ "settingsDistanceUnit": "Attāluma mērvienība",
+ "settingsAltitudeUnit": "Augstuma mērvienība",
+ "settingsSpeedUnit": "Ātruma mērvienība",
+ "settingsVolumeUnit": "Tilpuma mērvienība",
+ "settingsTwelveHourFormat": "12-h Formāts",
+ "settingsCoordinateFormat": "Koordinātu formāts",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Atskaites",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Ierīce",
+ "reportGroup": "Grupa",
+ "reportFrom": "No",
+ "reportTo": "Līdz",
+ "reportShow": "Parādīt",
+ "reportClear": "Notīrīt",
+ "linkGoogleMaps": "Google kartes",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Ielas skats",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Ierīces laiks",
+ "positionServerTime": "Servera Laiks",
+ "positionValid": "Derīgs",
+ "positionAccuracy": "Precizitāte",
+ "positionLatitude": "Platums",
+ "positionLongitude": "Garums",
+ "positionAltitude": "Augstums",
+ "positionSpeed": "Ātrums",
+ "positionCourse": "Kurss",
+ "positionAddress": "Adrese",
+ "positionProtocol": "Protokols",
+ "positionDistance": "Attālums",
+ "positionRpm": "RPM",
+ "positionFuel": "Degviela",
+ "positionPower": "Jauda",
+ "positionBattery": "Baterija",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelīti",
+ "positionSatVisible": "Redzamie satelīti",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Viesabonēšana",
+ "positionEvent": "Notikums",
+ "positionAlarm": "Trauksme",
+ "positionStatus": "Statuss",
+ "positionOdometer": "Odometrs",
+ "positionServiceOdometer": "Servisa nobraukums",
+ "positionTripOdometer": "Nobraukums",
+ "positionHours": "Stundas",
+ "positionSteps": "Soļi",
+ "positionInput": "Ievade",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Izvade",
+ "positionBatteryLevel": "Baterijas līmenis",
+ "positionFuelConsumption": "Degvielas patēriņš",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Programmatūras versija",
+ "positionVersionHw": "Aparatūras versija",
+ "positionIgnition": "Aizdedze",
+ "positionFlags": "Marķieri",
+ "positionCharge": "Lādējas",
+ "positionIp": "IP",
+ "positionArchive": "Arhīvs",
+ "positionVin": "VIN",
+ "positionApproximate": "Aptuvenais",
+ "positionThrottle": "Akselerators",
+ "positionMotion": "Kustība",
+ "positionArmed": "Aizsargāts",
+ "positionAcceleration": "Paātrinājums",
+ "positionTemp": "Temperatūra",
+ "positionDeviceTemp": "Ierīces Temperatūra",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operators",
+ "positionCommand": "Komanda",
+ "positionBlocked": "Bloķēts",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Ātrums",
+ "positionObdOdometer": "ODB Nobraukums",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Vadītāja unikālais ID",
+ "positionCard": "Card",
+ "positionImage": "Attēls",
+ "positionVideo": "Video",
+ "positionAudio": "Skaņa",
+ "serverTitle": "Servera iestatījumi ",
+ "serverZoom": "Palielinājums",
+ "serverRegistration": "Reģistrācija",
+ "serverReadonly": "Tikai lasāms",
+ "serverForceSettings": "Pāriestatīt Iestatījumus",
+ "serverAnnouncement": "Paziņojums",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Karte",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Kartes slānis",
+ "mapCustom": "Personalizēts (XYZ)",
+ "mapCustomArcgis": "Personalizēts (ArcGIS)",
+ "mapCustomLabel": "Personalizēta karte",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetKarte",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Karšu Atslēga",
+ "mapBingRoad": "Bing Karšu Ceļi",
+ "mapBingAerial": "Bing Karšu Apgabals",
+ "mapBingHybrid": "Bing Hibrīdkarte",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Kartes",
+ "mapYandexSat": "Yandex Satelliti",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Ielas",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satelīts",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here vienkāršā",
+ "mapHereHybrid": "Here hibrīda",
+ "mapHereSatellite": "Here satelītu",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Daudzstūris",
+ "mapShapeCircle": "Aplis",
+ "mapShapePolyline": "Lauzta līnija",
+ "mapLiveRoutes": "Reāllaika Maršruti",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Pašreizējā atrašanās vieta",
+ "mapPoiLayer": "POI Slānis",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Stāvoklis",
+ "stateName": "Īpašības",
+ "stateValue": "Vērtība",
+ "commandTitle": "Komanda",
+ "commandSend": "Sūtīt",
+ "commandSent": "Komanda nosūtīta",
+ "commandQueued": "Komanda ierindota",
+ "commandUnit": "Vienība",
+ "commandCustom": "Pielāgota komanda",
+ "commandDeviceIdentification": "Ierīces Identifikācija",
+ "commandPositionSingle": "Vienas Reizes Atskaite",
+ "commandPositionPeriodic": "Periodiska Atskaite",
+ "commandPositionStop": "Apturēt Atskaites",
+ "commandEngineStop": "Motora Slāpēšana",
+ "commandEngineResume": "Motora Startēšana",
+ "commandAlarmArm": "Aktivizēt Trauksmi",
+ "commandAlarmDisarm": "Izslēgt Trauksmi",
+ "commandAlarmDismiss": "Atslēgt Paziņojumu",
+ "commandSetTimezone": "Iestatīt Laika Zonu",
+ "commandRequestPhoto": "Pieprasīt Fotoattēlu",
+ "commandPowerOff": "Izslēgt Ierīci",
+ "commandRebootDevice": "Pārstartēt Ierīci",
+ "commandFactoryReset": "Sākotnējā režīma iestatīšana",
+ "commandSendSms": "Nosūtīt Īsziņu",
+ "commandSendUssd": "Nosūtīt USSD",
+ "commandSosNumber": "Iestatīt SOS numuru",
+ "commandSilenceTime": "Iestatīt Klusuma Laiku",
+ "commandSetPhonebook": "Iestatīt Tālruņa Grāmatu",
+ "commandVoiceMessage": "Balss Ziņojums",
+ "commandOutputControl": "Izejas Kontrole",
+ "commandVoiceMonitoring": "Balss uzraudzība",
+ "commandSetAgps": "Uzstādīt AGPS",
+ "commandSetIndicator": "Iestatīt Indikatoru",
+ "commandConfiguration": "Konfigurācija",
+ "commandGetVersion": "Saņemt versiju",
+ "commandFirmwareUpdate": "Atjaunot programmatūru",
+ "commandSetConnection": "Iestatīt savienojumu",
+ "commandSetOdometer": "Iestatīt odometru",
+ "commandGetModemStatus": "Saņemt modema statusu",
+ "commandGetDeviceStatus": "Saņemt ierīces statusu",
+ "commandSetSpeedLimit": "Iestatīt ātruma limitu",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Iestatīt akulumatora brīdinājumu",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Biežums",
+ "commandTimezone": "Laika Joslas Nobīde",
+ "commandMessage": "Ziņa",
+ "commandRadius": "Rādiuss",
+ "commandEnable": "Iespējot",
+ "commandData": "Datums",
+ "commandIndex": "Indekss",
+ "commandPhone": "Telefona Numurs",
+ "commandServer": "Serveris",
+ "commandPort": "Ports",
+ "eventAll": "Visi Notikumi",
+ "eventDeviceOnline": "Statuss aktīvs",
+ "eventDeviceUnknown": "Statuss nezināms",
+ "eventDeviceOffline": "Statuss bezsaistē",
+ "eventDeviceInactive": "Ierīce neaktīva",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Ierīce pārvietojas",
+ "eventDeviceStopped": "Ierīce apturēta",
+ "eventDeviceOverspeed": "Ātruma limits pārsniegts",
+ "eventDeviceFuelDrop": "Degvielas kritums",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Komandas rezultāts",
+ "eventGeofenceEnter": "Ienāca apgabalā",
+ "eventGeofenceExit": "Pameta apgabalu",
+ "eventAlarm": "Trauksme",
+ "eventIgnitionOn": "Aizdedze Iesl.",
+ "eventIgnitionOff": "Aizdedze Izsl.",
+ "eventMaintenance": "Nepieciešama tehniskā apkope",
+ "eventTextMessage": "Saņemta īsziņa",
+ "eventDriverChanged": "Mainījies vadītājs",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Ritināt Uz Pēdējo",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Vispārēji",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibrācija",
+ "alarmMovement": "Kustība",
+ "alarmLowspeed": "Zems Ātrums",
+ "alarmOverspeed": "Ātruma pārsniegšana",
+ "alarmFallDown": "Savienojuma Pārrāvums",
+ "alarmLowPower": "Zema Enerģija",
+ "alarmLowBattery": "Tukša Baterija",
+ "alarmFault": "Kļūda",
+ "alarmPowerOff": "Barošana Izsl.",
+ "alarmPowerOn": "Barošana Iesl.",
+ "alarmDoor": "Durvis",
+ "alarmLock": "Slēgt",
+ "alarmUnlock": "Atslēgt",
+ "alarmGeofence": "Apgabals",
+ "alarmGeofenceEnter": "Ienākšana Apgabalā",
+ "alarmGeofenceExit": "Apgabala pamešana",
+ "alarmGpsAntennaCut": "GPS Antena Atvienota",
+ "alarmAccident": "Negadījums",
+ "alarmTow": "Vilkšana",
+ "alarmIdle": "Tukšgaita",
+ "alarmHighRpm": "Augsti Apgriezieni",
+ "alarmHardAcceleration": "Straujšs paātrinājums",
+ "alarmHardBraking": "Strauja Bremzēšana",
+ "alarmHardCornering": "Strauja Manevrēšana",
+ "alarmLaneChange": "Joslas Maiņa",
+ "alarmFatigueDriving": "Neadekvāta Braukšana",
+ "alarmPowerCut": "Barošana Noslēgta",
+ "alarmPowerRestored": "Barošana Atjaunota",
+ "alarmJamming": "Sastrēgums",
+ "alarmTemperature": "Temperatūra",
+ "alarmParking": "Stāvvieta",
+ "alarmBonnet": "Motora pārsegs",
+ "alarmFootBrake": "Kājas bremze",
+ "alarmFuelLeak": "Degvielas noplūde",
+ "alarmTampering": "Iespaido",
+ "alarmRemoving": "Noņem",
+ "notificationType": "Ziņojuma Tips",
+ "notificationAlways": "Visas ierīces",
+ "notificationNotificators": "Kanāli",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "e-pasts",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Atkārtot",
+ "reportCombined": "Combined",
+ "reportRoute": "Maršruts",
+ "reportEvents": "Notikumi",
+ "reportTrips": "Braucieni",
+ "reportStops": "Pieturas",
+ "reportSummary": "Kopsavilkums",
+ "reportDaily": "Dienas Kopsavilkums",
+ "reportChart": "Grafiks",
+ "reportConfigure": "Konfigurēt",
+ "reportEventTypes": "Notikumu Veidi",
+ "reportChartType": "Grafika Veids",
+ "reportShowMarkers": "Rādīt Marķierus",
+ "reportExport": "Eksportēt",
+ "reportEmail": "e-pasta Ziņojums",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Periods",
+ "reportCustom": "Pielāgoti",
+ "reportToday": "Šodien",
+ "reportYesterday": "Vakar",
+ "reportThisWeek": "Šonedēļ",
+ "reportPreviousWeek": "Iepriekšējā nedēļa",
+ "reportThisMonth": "Šis mēnesis",
+ "reportPreviousMonth": "Iepriekšējais mēnesis",
+ "reportDeviceName": "Ierīces Nosaukums",
+ "reportAverageSpeed": "Vidējais Ātrums",
+ "reportMaximumSpeed": "Maksimālais Ātrums",
+ "reportEngineHours": "Motorstundas",
+ "reportDuration": "Ilgums",
+ "reportStartDate": "Sākuma Datums",
+ "reportStartTime": "Sākuma Laiks",
+ "reportStartAddress": "Sākuma Adrese",
+ "reportEndTime": "Beigu Laiks",
+ "reportEndAddress": "Beigu Adrese",
+ "reportSpentFuel": "Patērētā Degviela",
+ "reportStartOdometer": "Odometra sākums",
+ "reportEndOdometer": "Odometra beigas",
+ "statisticsTitle": "Statistika",
+ "statisticsCaptureTime": "Uzņemšanas Laiks",
+ "statisticsActiveUsers": "Aktīvie Lietotāji",
+ "statisticsActiveDevices": "Aktīvās Ierīces",
+ "statisticsRequests": "Pieprasījumi",
+ "statisticsMessagesReceived": "Saņemtie Ziņojumi",
+ "statisticsMessagesStored": "Saglabātie Ziņojumi",
+ "statisticsGeocoder": "Geocoder Pieprasījumi",
+ "statisticsGeolocation": "Atrašanās Vietu Pieprasījumi",
+ "categoryArrow": "Bultiņa",
+ "categoryDefault": "Noklusējums",
+ "categoryAnimal": "Dzīvnieks",
+ "categoryBicycle": "Velosipēds",
+ "categoryBoat": "Laiva",
+ "categoryBus": "Autobuss",
+ "categoryCar": "Automašīna",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Celtnis",
+ "categoryHelicopter": "Helikopters",
+ "categoryMotorcycle": "Motocikls",
+ "categoryOffroad": "Bezceļnieks",
+ "categoryPerson": "Persona",
+ "categoryPickup": "Pikaps",
+ "categoryPlane": "Lidmašīna",
+ "categoryShip": "Kuģis",
+ "categoryTractor": "Traktors",
+ "categoryTrain": "Vilciens",
+ "categoryTram": "Tramvajs",
+ "categoryTrolleybus": "Trolejbuss",
+ "categoryTruck": "Smagā mašīna",
+ "categoryVan": "Busiņš",
+ "categoryScooter": "Skrejritenis",
+ "maintenanceStart": "Sākt",
+ "maintenancePeriod": "Periods"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/mk.json b/legacy/web/l10n/mk.json
new file mode 100644
index 00000000..4aa2119e
--- /dev/null
+++ b/legacy/web/l10n/mk.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Вчитување...",
+ "sharedHide": "Сокриј",
+ "sharedSave": "Зачувај",
+ "sharedUpload": "Прикачи",
+ "sharedSet": "Постави",
+ "sharedCancel": "Откажи",
+ "sharedCopy": "Копирај",
+ "sharedAdd": "Додади",
+ "sharedEdit": "Уреди",
+ "sharedRemove": "Отстрани",
+ "sharedRemoveConfirm": "Дали да се отстрани предметот?",
+ "sharedNoData": "Нема податоци",
+ "sharedSubject": "Тема",
+ "sharedYes": "Да",
+ "sharedNo": "Не",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Час",
+ "sharedMinute": "Минута",
+ "sharedSecond": "Секунда",
+ "sharedDays": "денови",
+ "sharedHours": "часови",
+ "sharedMinutes": "минути",
+ "sharedDecimalDegrees": "Децимални Степени",
+ "sharedDegreesDecimalMinutes": "Степени Децимални Минути",
+ "sharedDegreesMinutesSeconds": "Степени Минути Секунди",
+ "sharedName": "Име",
+ "sharedDescription": "Опис",
+ "sharedSearch": "Пребарување",
+ "sharedIconScale": "Размер на икони",
+ "sharedGeofence": "Географска зона",
+ "sharedGeofences": "Географски зони",
+ "sharedCreateGeofence": "Креирај Географска зона",
+ "sharedNotifications": "Известувања",
+ "sharedNotification": "Известување",
+ "sharedAttributes": "Атрибути",
+ "sharedAttribute": "Атрибут",
+ "sharedDrivers": "Возачи",
+ "sharedDriver": "Возач",
+ "sharedArea": "Област",
+ "sharedSound": "Звук за известување",
+ "sharedType": "Тип",
+ "sharedDistance": "Растојание",
+ "sharedHourAbbreviation": "ч",
+ "sharedMinuteAbbreviation": "м",
+ "sharedSecondAbbreviation": "с",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "I",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Литар",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "л/ч",
+ "sharedGetMapState": "Состојба на Мапа",
+ "sharedComputedAttribute": "Пресметан Атрибут",
+ "sharedComputedAttributes": "Пресметани Атрибути",
+ "sharedCheckComputedAttribute": "Провери го пресметаниот атрибут",
+ "sharedExpression": "Израз",
+ "sharedDevice": "Уред",
+ "sharedTest": "Тест",
+ "sharedTestNotification": "Испрати тест известување",
+ "sharedTestNotificators": "Тест Канали",
+ "sharedTestExpression": "Тестирај Изразување",
+ "sharedCalendar": "Календар",
+ "sharedCalendars": "Календари",
+ "sharedFile": "Фајл",
+ "sharedSearchDevices": "Пребарај Уреди",
+ "sharedSortBy": "Подреди по",
+ "sharedFilterMap": "Филтер на Мапа",
+ "sharedSelectFile": "Избери фајл",
+ "sharedPhone": "Телефон",
+ "sharedRequired": "Задолжително",
+ "sharedPreferences": "Подесувања",
+ "sharedPermissions": "Дозволи",
+ "sharedConnections": "Конекции",
+ "sharedExtra": "Екстра",
+ "sharedPrimary": "Примарен",
+ "sharedSecondary": "Секундарен",
+ "sharedTypeString": "Стринг",
+ "sharedTypeNumber": "Број",
+ "sharedTypeBoolean": "Булеан",
+ "sharedTimezone": "Временска зона",
+ "sharedInfoTitle": "Инфо",
+ "sharedSavedCommand": "Зачувана Команда",
+ "sharedSavedCommands": "Зачувани Команди",
+ "sharedNew": "Нов...",
+ "sharedShowAddress": "Прикажи Адреса",
+ "sharedShowDetails": "Повеќе Детали",
+ "sharedDisabled": "Оневозможено",
+ "sharedMaintenance": "Одржување",
+ "sharedDeviceAccumulators": "Акумулатори",
+ "sharedAlarms": "Аларми",
+ "sharedLocation": "Локација",
+ "sharedImport": "Импортирај",
+ "sharedColumns": "Колони",
+ "sharedDropzoneText": "Повлечи фајл овде или кликни",
+ "sharedLogs": "Логови",
+ "sharedLink": "Линк",
+ "calendarSimple": "Едноставно",
+ "calendarRecurrence": "Повторување",
+ "calendarOnce": "Еднаш",
+ "calendarDaily": "Дневно",
+ "calendarWeekly": "Неделно",
+ "calendarMonthly": "Месечно",
+ "calendarDays": "Денови",
+ "calendarSunday": "Недела",
+ "calendarMonday": "Понеделник",
+ "calendarTuesday": "Вторник",
+ "calendarWednesday": "Среда",
+ "calendarThursday": "Четврток",
+ "calendarFriday": "Петок",
+ "calendarSaturday": "Сабота",
+ "attributeShowGeofences": "Прикажи Географски зони",
+ "attributeSpeedLimit": "Ограничување на брзината",
+ "attributeFuelDropThreshold": "Граница на прелиено гориво",
+ "attributeFuelIncreaseThreshold": "Граница на надополнето гориво",
+ "attributePolylineDistance": "Повеќелиниска оддалеченост",
+ "attributeReportIgnoreOdometer": "Извештај: Игнорирај го одометарот",
+ "attributeWebReportColor": "Веб: Боја на извештај",
+ "attributeDevicePassword": "Лозинка на уредот",
+ "attributeDeviceImage": "Слика на уредот",
+ "attributeDeviceInactivityStart": "Почеток на неактивност на уредот",
+ "attributeDeviceInactivityPeriod": "Период на неактивност на уредот",
+ "attributeProcessingCopyAttributes": "Процесирање: Копирање на атрибути",
+ "attributeColor": "Боја",
+ "attributeWebLiveRouteLength": "Веб: Должина на рута",
+ "attributeWebSelectZoom": "Веб: Зумирај го селектираното",
+ "attributeWebMaxZoom": "Веб: Максимално зумирање",
+ "attributeTelegramChatId": "Телеграм ID",
+ "attributePushoverUserKey": "Прoследи кориснички клуч",
+ "attributePushoverDeviceNames": "Проследи ги имињата на уредите",
+ "attributeMailSmtpHost": "Меил: SMTP хост",
+ "attributeMailSmtpPort": "Меил: SMTP порт",
+ "attributeMailSmtpStarttlsEnable": "Меил: Овозможи SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "Меил: SMTP STARTTLS е потребен",
+ "attributeMailSmtpSslEnable": "Меил: Овозможи SMTP SSL",
+ "attributeMailSmtpSslTrust": "Меил: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Меил: SMTP SSL протоколи",
+ "attributeMailSmtpFrom": "Меил: SMTP Испраќач",
+ "attributeMailSmtpAuth": "Меил: Овозможи SMTP автентикација",
+ "attributeMailSmtpUsername": "Меил: SMTP корисничко име",
+ "attributeMailSmtpPassword": "Меил: SMTP лозинка",
+ "attributeUiDisableSavedCommands": "Исклучи зачувани команди",
+ "attributeUiDisableAttributes": "UI: Оневозможи атрибути",
+ "attributeUiDisableGroups": "UI: Оневозможи групи",
+ "attributeUiDisableEvents": "UI: Оневозможи настани",
+ "attributeUiDisableVehicleFeatures": "UI: Оневозможи карактеристики на возила",
+ "attributeUiDisableDrivers": "UI: Оневозможи возачи",
+ "attributeUiDisableComputedAttributes": "UI: Оневозможи пресметани атрибути",
+ "attributeUiDisableCalendars": "UI: Оневозможи календари",
+ "attributeUiDisableMaintenance": "UI: Оневозможи одржување",
+ "attributeUiHidePositionAttributes": "UI: Сокриј атрибути на позиција",
+ "attributeUiDisableLoginLanguage": "UI: Оневозможи промена на јазик при најава",
+ "attributeNotificationTokens": "Токени за известување",
+ "attributePopupInfo": "Popup инфо",
+ "errorTitle": "Грешка",
+ "errorGeneral": "Невалидни параметри или кршење на ограничувањето",
+ "errorConnection": "Грешка во комуникација",
+ "errorSocket": "Web socket грешка во комуникација",
+ "errorZero": "Не може да биди нула",
+ "userEmail": "e-mail",
+ "userPassword": "Лозинка",
+ "userAdmin": "Администратор",
+ "userRemember": "Запамти",
+ "userExpirationTime": "Истекува на",
+ "userDeviceLimit": "Максимален број на уреди",
+ "userUserLimit": "Максимален број на корисници",
+ "userDeviceReadonly": "Уредот е Readonly",
+ "userLimitCommands": "Ограничи команди",
+ "userDisableReports": "Оневозможи извештаи",
+ "userFixedEmail": "Забрани промена на e-mail",
+ "userToken": "Токен",
+ "userDeleteAccount": "Избриши Акаунт",
+ "userTemporary": "Привремено",
+ "loginTitle": "Најава",
+ "loginLanguage": "Јазик",
+ "loginReset": "Ресетирај лозинка",
+ "loginRegister": "Регистрација",
+ "loginLogin": "Најава",
+ "loginOpenId": "Најава со OpenID",
+ "loginFailed": "невалидна e-mail адреса или лозинка",
+ "loginCreated": "Нов корисник е регистриран",
+ "loginResetSuccess": "Проверете ја вашата e-mail адреса",
+ "loginUpdateSuccess": "Новата лозинка е поставена",
+ "loginLogout": "Одјава",
+ "loginLogo": "Лого",
+ "loginTotpCode": "Еднократен код за лозинка",
+ "loginTotpKey": "Еднократен клуч за лозинка",
+ "devicesAndState": "Уреди и статус",
+ "deviceSelected": "Избран уред",
+ "deviceTitle": "Уреди",
+ "devicePrimaryInfo": "Назив на уред",
+ "deviceSecondaryInfo": "Детали за уред",
+ "deviceIdentifier": "Идентификатор",
+ "deviceModel": "Модел",
+ "deviceContact": "Контакт",
+ "deviceCategory": "Категорија",
+ "deviceLastUpdate": "Последна промена",
+ "deviceCommand": "Команда",
+ "deviceFollow": "Прати",
+ "deviceTotalDistance": "Вкупно растојание",
+ "deviceStatus": "Статус",
+ "deviceStatusOnline": "Достапен",
+ "deviceStatusOffline": "Недостапен",
+ "deviceStatusUnknown": "Непознато",
+ "deviceRegisterFirst": "Регистрирај го твојот прв уред",
+ "deviceIdentifierHelp": "IMEI, сериски број или друг ID. Треба да биде ист со уредот кој се поврзува на сервер",
+ "deviceShare": "Сподели уред",
+ "groupDialog": "Група",
+ "groupParent": "Група",
+ "groupNoGroup": "Нема група",
+ "settingsTitle": "Подесувања",
+ "settingsUser": "Акаунт",
+ "settingsGroups": "Групи",
+ "settingsServer": "Сервер",
+ "settingsUsers": "Корисници",
+ "settingsDistanceUnit": "Единица за растојание",
+ "settingsAltitudeUnit": "Единица за висина",
+ "settingsSpeedUnit": "Единица за брзина",
+ "settingsVolumeUnit": "Единица за волумен",
+ "settingsTwelveHourFormat": "12-часовен формат",
+ "settingsCoordinateFormat": "Формат за координати",
+ "settingsServerVersion": "Верзија на сервер",
+ "settingsAppVersion": "Верзија на апликација",
+ "settingsConnection": "Конекција",
+ "settingsDarkMode": "Dark мод",
+ "settingsTotpEnable": "Овозможи еднократна лозинка",
+ "settingsTotpForce": "Форсирај еднократна лозинка",
+ "settingsServiceWorkerUpdateInterval": "Интервал на ажурирање за ServiceWorker",
+ "settingsUpdateAvailable": "Достапна е нова верзија",
+ "settingsSupport": "Поддршка",
+ "reportTitle": "Извештаи",
+ "reportScheduled": "Редовни извештаи",
+ "reportDevice": "Уред",
+ "reportGroup": "Група",
+ "reportFrom": "Од",
+ "reportTo": "До",
+ "reportShow": "Прикажи",
+ "reportClear": "Избриши",
+ "linkGoogleMaps": "Google мапи",
+ "linkAppleMaps": "Apple мапи",
+ "linkStreetView": "Уличен поглед мод",
+ "positionFixTime": "Време за фиксирање",
+ "positionDeviceTime": "Време на уредот",
+ "positionServerTime": "Време на сервер",
+ "positionValid": "Валидно",
+ "positionAccuracy": "Прецизност",
+ "positionLatitude": "Географска ширина",
+ "positionLongitude": "Географска должина",
+ "positionAltitude": "Висина",
+ "positionSpeed": "Брзина",
+ "positionCourse": "Правец",
+ "positionAddress": "Адреса",
+ "positionProtocol": "Протокол",
+ "positionDistance": "Растојание",
+ "positionRpm": "Обртаи",
+ "positionFuel": "Гориво",
+ "positionPower": "Напојување",
+ "positionBattery": "Батерија",
+ "positionRaw": "Сирови податоци",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Сателити",
+ "positionSatVisible": "Видливи сателити",
+ "positionRssi": "RSSI",
+ "positionGps": "ГПС",
+ "positionRoaming": "Роаминг",
+ "positionEvent": "Настан",
+ "positionAlarm": "Аларм",
+ "positionStatus": "Статус",
+ "positionOdometer": "Одометар",
+ "positionServiceOdometer": "Сервисен одометар",
+ "positionTripOdometer": "Патен одометар",
+ "positionHours": "Часови",
+ "positionSteps": "Чекори",
+ "positionInput": "Влез",
+ "positionHeartRate": "Пулс",
+ "positionOutput": "Излез",
+ "positionBatteryLevel": "Ниво на батерија",
+ "positionFuelConsumption": "Потрошувачка на гориво",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Верзија на фирмвер",
+ "positionVersionHw": "Верзија на хардвер",
+ "positionIgnition": "Контакт-IGN",
+ "positionFlags": "Ознаки",
+ "positionCharge": "Полнење",
+ "positionIp": "IP",
+ "positionArchive": "Архива",
+ "positionVin": "Бр. шасија",
+ "positionApproximate": "Приближно",
+ "positionThrottle": "Гас",
+ "positionMotion": "Движење",
+ "positionArmed": "Активен",
+ "positionAcceleration": "Забрзување",
+ "positionTemp": "Температура",
+ "positionDeviceTemp": "Температура на уред",
+ "positionCoolantTemp": "Температура на разладен елемент",
+ "positionOperator": "Оператор",
+ "positionCommand": "Команда",
+ "positionBlocked": "Блокирано",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Брзина",
+ "positionObdOdometer": "OBD одометар",
+ "positionDrivingTime": "Време на возење",
+ "positionDriverUniqueId": "ID на возач",
+ "positionCard": "Картичка",
+ "positionImage": "Слика",
+ "positionVideo": "Видео",
+ "positionAudio": "Аудио",
+ "serverTitle": "Подесувања за сервер",
+ "serverZoom": "Зумирање",
+ "serverRegistration": "Регистрација",
+ "serverReadonly": "Само преглед",
+ "serverForceSettings": "Форсирани поставки",
+ "serverAnnouncement": "Објава",
+ "serverName": "Име на сервер",
+ "serverDescription": "Опис на сервер",
+ "serverColorPrimary": "Примарна боја",
+ "serverColorSecondary": "Секундарна боја",
+ "serverLogo": "Слика за лого",
+ "serverLogoInverted": "Инверзна слика за лого",
+ "serverChangeDisable": "Оневозможи промена на сервер",
+ "serverDisableShare": "Оневозможи споделување на уреди",
+ "mapTitle": "Мапа",
+ "mapActive": "Активни мапи",
+ "mapOverlay": "Преклопени мапи",
+ "mapOverlayCustom": "Прилагодено преклопување",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API клуч",
+ "mapOpenWeatherClouds": "OpenWeather облаци",
+ "mapOpenWeatherPrecipitation": "OpenWeather врнежи",
+ "mapOpenWeatherPressure": "OpenWeather атм. притисок",
+ "mapOpenWeatherWind": "OpenWeather Ветер",
+ "mapOpenWeatherTemperature": "OpenWeather Температура",
+ "mapLayer": "Тип на мапа",
+ "mapCustom": "Прилагодено (XYZ)",
+ "mapCustomArcgis": "Прилагодено (ArcGIS)",
+ "mapCustomLabel": "Прилагодена мапа",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google патишта",
+ "mapGoogleHybrid": "Google хибрид",
+ "mapGoogleSatellite": "Google сателити",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps клуч",
+ "mapBingRoad": "Bing Maps патишта",
+ "mapBingAerial": "Bing Maps воздушна",
+ "mapBingHybrid": "Bing Maps хибрид",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex сателит",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox сателит",
+ "mapMapboxKey": "Mapbox Токен за пристап",
+ "mapMapTilerBasic": "MapTiler основна",
+ "mapMapTilerHybrid": "MapTiler хибрид",
+ "mapMapTilerKey": "MapTiler API клуч",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ токен за пристап",
+ "mapTomTomBasic": "TomTom основна",
+ "mapTomTomFlow": "TomTom сообраќај",
+ "mapTomTomIncidents": "TomTom инциденти во сообраќај",
+ "mapTomTomKey": "TomTom API клуч",
+ "mapHereBasic": "Here основна",
+ "mapHereHybrid": "Here хибрид",
+ "mapHereSatellite": "Here сателит",
+ "mapHereFlow": "Here сообраќај",
+ "mapHereKey": "Here API клуч",
+ "mapShapePolygon": "Полигон",
+ "mapShapeCircle": "Круг",
+ "mapShapePolyline": "Полилинија",
+ "mapLiveRoutes": "Рути во живо",
+ "mapDirection": "Покажи насоки",
+ "mapCurrentLocation": "Моментална локација",
+ "mapPoiLayer": "Слој за точки од интерес",
+ "mapClustering": "Организација на маркери",
+ "mapOnSelect": "Прикажи мапа при селекција",
+ "mapDefault": "Предефинирана мапа",
+ "stateTitle": "Состојба",
+ "stateName": "Атрибут",
+ "stateValue": "Вредност",
+ "commandTitle": "Команда",
+ "commandSend": "Испрати",
+ "commandSent": "Командата е испратена",
+ "commandQueued": "Командата е на чекање",
+ "commandUnit": "Единица",
+ "commandCustom": "Прилагодена команда",
+ "commandDeviceIdentification": "Идентификација на уред",
+ "commandPositionSingle": "Единечно известување",
+ "commandPositionPeriodic": "Периодично известување",
+ "commandPositionStop": "Исклучи известување",
+ "commandEngineStop": "Изгаснат мотор",
+ "commandEngineResume": "Мотор во работа",
+ "commandAlarmArm": "Активирај аларм",
+ "commandAlarmDisarm": "Деактивирај аларм",
+ "commandAlarmDismiss": "Откажи аларм",
+ "commandSetTimezone": "Постави временска зона",
+ "commandRequestPhoto": "Побарај фотографија",
+ "commandPowerOff": "Исклучи уред",
+ "commandRebootDevice": "Рестартирај уред",
+ "commandFactoryReset": "Фабрични подесувања",
+ "commandSendSms": "Испрати СМС",
+ "commandSendUssd": "Испрати USSD",
+ "commandSosNumber": "Постави SOS број",
+ "commandSilenceTime": "Постави тивко време",
+ "commandSetPhonebook": "Постави Контакти",
+ "commandVoiceMessage": "Говорна порака",
+ "commandOutputControl": "Контрола на излез",
+ "commandVoiceMonitoring": "Гласовен мониторинг",
+ "commandSetAgps": "Постави АГПС",
+ "commandSetIndicator": "Постави индикатор",
+ "commandConfiguration": "Конфигурација",
+ "commandGetVersion": "Провери верзија",
+ "commandFirmwareUpdate": "Надградба на фирмвер",
+ "commandSetConnection": "Постави конекција",
+ "commandSetOdometer": "Постави одометар",
+ "commandGetModemStatus": "Провери статус на модем",
+ "commandGetDeviceStatus": "Провери статус на уред",
+ "commandSetSpeedLimit": "Постави ограничување на брзина",
+ "commandModePowerSaving": "Економичен мод",
+ "commandModeDeepSleep": "Deep Sleep мод",
+ "commandAlarmGeofence": "Постави аларм за географска зона",
+ "commandAlarmBattery": "Постави аларм за батерија",
+ "commandAlarmSos": "Постави СОС аларм",
+ "commandAlarmRemove": "Поставки за бришење на аларм",
+ "commandAlarmClock": "Постави временски аларм",
+ "commandAlarmSpeed": "Постави аларм за брзина",
+ "commandAlarmFall": "Постави аларм за пад",
+ "commandAlarmVibration": "Постави аларм за вибрации",
+ "commandFrequency": "Фреквенција",
+ "commandTimezone": "Отстапување од временска зона",
+ "commandMessage": "Порака",
+ "commandRadius": "Радиус",
+ "commandEnable": "Овозможи",
+ "commandData": "Податоци",
+ "commandIndex": "Индекс",
+ "commandPhone": "Телефонски број",
+ "commandServer": "Сервер",
+ "commandPort": "Порт",
+ "eventAll": "Сите настани",
+ "eventDeviceOnline": "Статус вклучен",
+ "eventDeviceUnknown": "Статус напознат",
+ "eventDeviceOffline": "Статус исклучен",
+ "eventDeviceInactive": "Уредот е неактивен",
+ "eventQueuedCommandSent": "Испратена команда на чекање",
+ "eventDeviceMoving": "Уредот е во движење",
+ "eventDeviceStopped": "Уредот е запрен",
+ "eventDeviceOverspeed": "Брзината е над дозволената",
+ "eventDeviceFuelDrop": "Пад на ниво на гориво",
+ "eventDeviceFuelIncrease": "Дотур на гориво",
+ "eventCommandResult": "Статус од команда",
+ "eventGeofenceEnter": "Влез во географска зона",
+ "eventGeofenceExit": "Излез од географска зона",
+ "eventAlarm": "Аларм",
+ "eventIgnitionOn": "Вклучен контакт-IGN",
+ "eventIgnitionOff": "Исклучен контакт-IGN",
+ "eventMaintenance": "Потребно е да се изврши одржување",
+ "eventTextMessage": "Примена е текст порака",
+ "eventDriverChanged": "Променет возач",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Прелистај до последна",
+ "eventsSoundEvents": "Звучни настани",
+ "eventsSoundAlarms": "звучни аларми",
+ "alarmGeneral": "Општо",
+ "alarmSos": "СОС",
+ "alarmVibration": "Вибрација",
+ "alarmMovement": "Движење",
+ "alarmLowspeed": "Мала брзина",
+ "alarmOverspeed": "Прекорачување на брзината",
+ "alarmFallDown": "Пад",
+ "alarmLowPower": "Слаб напон",
+ "alarmLowBattery": "Ниско ниво на батерија",
+ "alarmFault": "дефект, грешка",
+ "alarmPowerOff": "Исклучи",
+ "alarmPowerOn": "Уклучи",
+ "alarmDoor": "Врата",
+ "alarmLock": "Заклучи",
+ "alarmUnlock": "Отклучи",
+ "alarmGeofence": "Географска зона",
+ "alarmGeofenceEnter": "Влез во географска зона",
+ "alarmGeofenceExit": "Излез од географска зона",
+ "alarmGpsAntennaCut": "ГПС антената е исклучена",
+ "alarmAccident": "Несреќа",
+ "alarmTow": "Влечи",
+ "alarmIdle": "Неутрална брзина-лер",
+ "alarmHighRpm": "Високи обртаи",
+ "alarmHardAcceleration": "Нагло забрзување",
+ "alarmHardBraking": "Нагло кочење",
+ "alarmHardCornering": "Нагло свртување",
+ "alarmLaneChange": "Промена на траса",
+ "alarmFatigueDriving": "Возење со замор",
+ "alarmPowerCut": "Прекин на напојување",
+ "alarmPowerRestored": "Напојувањето е вратено во функција",
+ "alarmJamming": "Блокирање",
+ "alarmTemperature": "Температура",
+ "alarmParking": "Паркирање",
+ "alarmBonnet": "Хауба",
+ "alarmFootBrake": "Кочница",
+ "alarmFuelLeak": "Истекување на гориво",
+ "alarmTampering": "Манипулирање",
+ "alarmRemoving": "Отстранување",
+ "notificationType": "Тип на известување",
+ "notificationAlways": "Сите уреди",
+ "notificationNotificators": "Канали",
+ "notificatorCommand": "Команда",
+ "notificatorWeb": "Веб",
+ "notificatorMail": "е-mail",
+ "notificatorSms": "СМС",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Телеграм",
+ "notificatorPushover": "Проследи",
+ "reportReplay": "Репродукција",
+ "reportCombined": "Комбинирано",
+ "reportRoute": "Рута",
+ "reportEvents": "Настани",
+ "reportTrips": "Патувања",
+ "reportStops": "Застанувања",
+ "reportSummary": "Преглед",
+ "reportDaily": "Дневен преглед",
+ "reportChart": "Графикон",
+ "reportConfigure": "Конфигурирај",
+ "reportEventTypes": "Типови на настани",
+ "reportChartType": "Тип на графикон",
+ "reportShowMarkers": "Покажи маркери",
+ "reportExport": "Извези",
+ "reportEmail": "Извештај по е-mail",
+ "reportSchedule": "Распоред",
+ "reportPeriod": "Период",
+ "reportCustom": "Прилагодено",
+ "reportToday": "Денес",
+ "reportYesterday": "Вчера",
+ "reportThisWeek": "Тековна седмица",
+ "reportPreviousWeek": "Претходна седмица",
+ "reportThisMonth": "Тековен месец",
+ "reportPreviousMonth": "Претходен месец",
+ "reportDeviceName": "Име на уред",
+ "reportAverageSpeed": "Просечна брзина",
+ "reportMaximumSpeed": "Максимална брзина",
+ "reportEngineHours": "Работни саати",
+ "reportDuration": "Времетраење",
+ "reportStartDate": "Почетен датум",
+ "reportStartTime": "Почетно време",
+ "reportStartAddress": "Почетна адреса",
+ "reportEndTime": "Крајно време",
+ "reportEndAddress": "Крајна адреса",
+ "reportSpentFuel": "Потрошено гориво",
+ "reportStartOdometer": "Почетна километража",
+ "reportEndOdometer": "Крајна километража",
+ "statisticsTitle": "Статистики",
+ "statisticsCaptureTime": "Време на сликање",
+ "statisticsActiveUsers": "Активни корисници",
+ "statisticsActiveDevices": "Активни уреди",
+ "statisticsRequests": "Барања",
+ "statisticsMessagesReceived": "Примени пораки",
+ "statisticsMessagesStored": "Сочувани пораки",
+ "statisticsGeocoder": "барања од геокодер",
+ "statisticsGeolocation": "барања од геолокација",
+ "categoryArrow": "Стрелка",
+ "categoryDefault": "Основно",
+ "categoryAnimal": "Животно",
+ "categoryBicycle": "Велосипед",
+ "categoryBoat": "Чамец",
+ "categoryBus": "Автобус",
+ "categoryCar": "Автомобил",
+ "categoryCamper": "Кампер",
+ "categoryCrane": "Кран",
+ "categoryHelicopter": "Хеликоптер",
+ "categoryMotorcycle": "Моторцикл",
+ "categoryOffroad": "Теренец",
+ "categoryPerson": "Личност",
+ "categoryPickup": "Пикап",
+ "categoryPlane": "Авион",
+ "categoryShip": "Брод",
+ "categoryTractor": "Трактор",
+ "categoryTrain": "Воз",
+ "categoryTram": "Трамвај",
+ "categoryTrolleybus": "Тролејбус",
+ "categoryTruck": "Камион",
+ "categoryVan": "Комбе",
+ "categoryScooter": "Скутер",
+ "maintenanceStart": "Почеток",
+ "maintenancePeriod": "Период"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ml.json b/legacy/web/l10n/ml.json
new file mode 100644
index 00000000..40dde8f2
--- /dev/null
+++ b/legacy/web/l10n/ml.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "ലോഡുചെയ്യുന്നു ..",
+ "sharedHide": "മറയ്ക്കുക",
+ "sharedSave": "സേവ്",
+ "sharedUpload": "Upload",
+ "sharedSet": "സെറ്റ്",
+ "sharedCancel": "റദ്ദാക്കുക",
+ "sharedCopy": "Copy",
+ "sharedAdd": "ചേര്‍ക്കുക",
+ "sharedEdit": "തിരുത്തുക",
+ "sharedRemove": "നീക്കം ചെയ്യുക",
+ "sharedRemoveConfirm": "ഐറ്റം നീക്കം ചെയ്യട്ടെ ?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "കി.മീ.",
+ "sharedMi": "മൈൽ",
+ "sharedNmi": "നൗട്ടിക്കൽ മൈൽ",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "കനോട്സ്",
+ "sharedKmh": "കിലോമീറ്റർ /മണിക്കൂർ",
+ "sharedMph": "മൈൽസ് / മണിക്കൂർ",
+ "sharedHour": "മണിക്കൂർ",
+ "sharedMinute": "മിനിറ്റ്",
+ "sharedSecond": "സെക്കന്റ്",
+ "sharedDays": "ദിവസങ്ങൾ ",
+ "sharedHours": "മണിക്കൂറുകൾ",
+ "sharedMinutes": "മിനിറ്റ് ",
+ "sharedDecimalDegrees": "ദശാംശ ഡിഗ്രി",
+ "sharedDegreesDecimalMinutes": "ഡിഗ്രി ദശാംശ മിനിറ്റ് ",
+ "sharedDegreesMinutesSeconds": "ഡിഗ്രി മിനിറ്റ് സെക്കൻഡ് ",
+ "sharedName": "പേര്",
+ "sharedDescription": "വിവരണം",
+ "sharedSearch": "സെർച്ച് ",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "ജിയോഫെൻസ് ",
+ "sharedGeofences": "ജിയോഫെൻസെസ് ",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "അറിയിപ്പുകൾ",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "അട്രീബൂട്ട്സ് ",
+ "sharedAttribute": "അട്രീബൂട്ട്",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
+ "sharedArea": "ഏരിയ",
+ "sharedSound": "അറിയിപ്പ് ശബ്ദം",
+ "sharedType": "ടൈപ്പ്",
+ "sharedDistance": "ദൂരം ",
+ "sharedHourAbbreviation": "മണിക്കൂർ ",
+ "sharedMinuteAbbreviation": "മിനിറ്റ് ",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "വോൾട്ട് ",
+ "sharedLiterAbbreviation": "ലിറ്റർ ",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "ലിറ്റർ / മണിക്കൂർ ",
+ "sharedGetMapState": "മാപ് സ്റ്റേറ്റ് ലഭ്യമാക്കുക ",
+ "sharedComputedAttribute": "കമ്പ്യൂട്ടേഡ്‌ അട്രീബൂട്ട് ",
+ "sharedComputedAttributes": "കമ്പ്യൂട്ടേഡ്‌ അട്രിബൂട്ടുകൾ ",
+ "sharedCheckComputedAttribute": "കമ്പ്യൂട്ടേഡ്‌ അട്രീബൂട്ട് പരിശോധിക്കുക ",
+ "sharedExpression": "എക്സ്പ്രെഷൻ ",
+ "sharedDevice": "വാഹനം",
+ "sharedTest": "Test",
+ "sharedTestNotification": "ടെസ്റ്റ് നോട്ടിഫിക്കേഷൻ അയക്കുക ",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "കലണ്ടർ ",
+ "sharedCalendars": "കലണ്ടറുകൾ ",
+ "sharedFile": "ഫയൽ ",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "ഫയൽ തിരഞ്ഞെടുക്കുക",
+ "sharedPhone": "ഫോൺ",
+ "sharedRequired": "അനിവാര്യം",
+ "sharedPreferences": "ഇഷ്ടങ്ങൾ ",
+ "sharedPermissions": "പെർമിഷനുകൾ",
+ "sharedConnections": "Connections",
+ "sharedExtra": "എക്സ്ട്രാ ",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "സ്ട്രിംഗ്",
+ "sharedTypeNumber": "നമ്പർ ",
+ "sharedTypeBoolean": "ബൂളിയാൻ ",
+ "sharedTimezone": "ടൈം സോൺ ",
+ "sharedInfoTitle": "ഇൻഫോ ",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "സ്പീഡ് ലിമിറ്റ്‌ ",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Report: Ignore Odometer",
+ "attributeWebReportColor": "Web: Report Color",
+ "attributeDevicePassword": "Device Password",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "Color",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "എറർ !",
+ "errorGeneral": "പാരാമീറ്റർ എറർ !",
+ "errorConnection": "കണക്ഷൻ എറർ !",
+ "errorSocket": "വെബ് സോക്കറ്റ് കണക്ഷൻ എറർ !",
+ "errorZero": "Can't be zero",
+ "userEmail": "ഇമെയിൽ",
+ "userPassword": "പാസ്സ്‌വേർഡ് ",
+ "userAdmin": "അഡ്മിൻ ",
+ "userRemember": "ഓർത്തിരിക്കുക ",
+ "userExpirationTime": "Expiration",
+ "userDeviceLimit": "Device Limit",
+ "userUserLimit": "User Limit",
+ "userDeviceReadonly": "Device Readonly",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "ലോഗിൻ ചെയ്യുക ",
+ "loginLanguage": "ഭാഷ",
+ "loginReset": "Reset Password",
+ "loginRegister": "രെജിസ്റ്റർ ",
+ "loginLogin": "അകത്തു പ്രവേശിക്കുക",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "തെറ്റായ ഇമെയിൽ വിലാസവും പാസ്വേഡും",
+ "loginCreated": "പുതിയ ഉപയോക്താവ് രജിസ്റ്റർ ചെയ്തു",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "പുറത്തുകടക്കുക",
+ "loginLogo": "ലോഗോ",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "സാധനങ്ങളിന് നില ",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "സാധനങ്ങളിന് ",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "ഐഡന്റിഫയർ",
+ "deviceModel": "Model",
+ "deviceContact": "Contact",
+ "deviceCategory": "Category",
+ "deviceLastUpdate": "Last Update",
+ "deviceCommand": "Command",
+ "deviceFollow": "Follow",
+ "deviceTotalDistance": "Total Distance",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Unknown",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "ഗ്രൂപ്പ്",
+ "groupParent": "Group",
+ "groupNoGroup": "No Group",
+ "settingsTitle": "Settings",
+ "settingsUser": "Account",
+ "settingsGroups": "Groups",
+ "settingsServer": "Server",
+ "settingsUsers": "Users",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "12-hour Format",
+ "settingsCoordinateFormat": "Coordinates Format",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Reports",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "ഉപകരണം",
+ "reportGroup": "Group",
+ "reportFrom": "From",
+ "reportTo": "To",
+ "reportShow": "Show",
+ "reportClear": "Clear",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Valid",
+ "positionAccuracy": "Accuracy",
+ "positionLatitude": "അക്ഷാംശം",
+ "positionLongitude": "രേഖാംശം",
+ "positionAltitude": "Altitude",
+ "positionSpeed": "വേഗം",
+ "positionCourse": "Course",
+ "positionAddress": "Address",
+ "positionProtocol": "Protocol",
+ "positionDistance": "Distance",
+ "positionRpm": "RPM",
+ "positionFuel": "Fuel",
+ "positionPower": "Power",
+ "positionBattery": "Battery",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Event",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hours",
+ "positionSteps": "Steps",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Battery Level",
+ "positionFuelConsumption": "Fuel Consumption",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Ignition",
+ "positionFlags": "Flags",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Motion",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Device Temperature",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Command",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Server Settings",
+ "serverZoom": "വലുതാക്കിയോ ചെറുതാക്കിയോ കാണിക്കുക",
+ "serverRegistration": "രജിസ്ട്രേഷൻ",
+ "serverReadonly": "Readonly",
+ "serverForceSettings": "Force Settings",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "ഭൂപടം",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Map Layer",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polygon",
+ "mapShapeCircle": "Circle",
+ "mapShapePolyline": "Polyline",
+ "mapLiveRoutes": "Live Routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "State",
+ "stateName": "Attribute",
+ "stateValue": "Value",
+ "commandTitle": "Command",
+ "commandSend": "Send",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "Unit",
+ "commandCustom": "Custom command",
+ "commandDeviceIdentification": "Device Identification",
+ "commandPositionSingle": "Single Reporting",
+ "commandPositionPeriodic": "Periodic Reporting",
+ "commandPositionStop": "Stop Reporting",
+ "commandEngineStop": "Engine Stop",
+ "commandEngineResume": "Engine Resume",
+ "commandAlarmArm": "Arm Alarm",
+ "commandAlarmDisarm": "Disarm Alarm",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Set Timezone",
+ "commandRequestPhoto": "Request Photo",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Reboot Device",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Send SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "Set SOS Number",
+ "commandSilenceTime": "Set Silence Time",
+ "commandSetPhonebook": "Set Phonebook",
+ "commandVoiceMessage": "Voice Message",
+ "commandOutputControl": "Output Control",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Set Indicator",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frequency",
+ "commandTimezone": "Timezone Offset",
+ "commandMessage": "Message",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Data",
+ "commandIndex": "Index",
+ "commandPhone": "Phone Number",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "All Events",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Command result",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Maintenance required",
+ "eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Type of Notification",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Route",
+ "reportEvents": "Events",
+ "reportTrips": "Trips",
+ "reportStops": "Stops",
+ "reportSummary": "Summary",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Chart",
+ "reportConfigure": "Configure",
+ "reportEventTypes": "Event Types",
+ "reportChartType": "Chart Type",
+ "reportShowMarkers": "Show Markers",
+ "reportExport": "Export",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "Device Name",
+ "reportAverageSpeed": "Average Speed",
+ "reportMaximumSpeed": "Maximum Speed",
+ "reportEngineHours": "Engine Hours",
+ "reportDuration": "Duration",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Start Time",
+ "reportStartAddress": "Start Address",
+ "reportEndTime": "End Time",
+ "reportEndAddress": "End Address",
+ "reportSpentFuel": "Spent Fuel",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Statistics",
+ "statisticsCaptureTime": "Capture Time",
+ "statisticsActiveUsers": "Active Users",
+ "statisticsActiveDevices": "Active Devices",
+ "statisticsRequests": "Requests",
+ "statisticsMessagesReceived": "Messages Received",
+ "statisticsMessagesStored": "Messages Stored",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Arrow",
+ "categoryDefault": "Default",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicycle",
+ "categoryBoat": "Boat",
+ "categoryBus": "Bus",
+ "categoryCar": "Car",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "Motorcycle",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Plane",
+ "categoryShip": "Ship",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Truck",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/mn.json b/legacy/web/l10n/mn.json
new file mode 100644
index 00000000..ea3ecedb
--- /dev/null
+++ b/legacy/web/l10n/mn.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Ачааллаж байна...",
+ "sharedHide": "Нуух",
+ "sharedSave": "Хадгалах",
+ "sharedUpload": "Upload",
+ "sharedSet": "Тааруулах",
+ "sharedCancel": "Цуцлах",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Нэмэх",
+ "sharedEdit": "Засах",
+ "sharedRemove": "Хасах",
+ "sharedRemoveConfirm": "Үүнийг устгах уу?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Тийм",
+ "sharedNo": "Үгүй",
+ "sharedKm": "км",
+ "sharedMi": "миль",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "Зангилаа",
+ "sharedKmh": "км/ц",
+ "sharedMph": "миль/цаг",
+ "sharedHour": "Цаг",
+ "sharedMinute": "Минут",
+ "sharedSecond": "Секунд",
+ "sharedDays": "өдөр",
+ "sharedHours": "цаг",
+ "sharedMinutes": "минут",
+ "sharedDecimalDegrees": "Градус 10-тын бутархай",
+ "sharedDegreesDecimalMinutes": "Градус Минут нь 10-тын бутархай",
+ "sharedDegreesMinutesSeconds": "Градус Минут Секунд",
+ "sharedName": "Нэр",
+ "sharedDescription": "Тайлбар",
+ "sharedSearch": "Хайх",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Хязгаарлалт",
+ "sharedGeofences": "Хязгаарлалтууд",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Мэдэгдэлүүд",
+ "sharedNotification": "Мэдэгдэл",
+ "sharedAttributes": "Утгууд",
+ "sharedAttribute": "Утга",
+ "sharedDrivers": "Жолооч нар",
+ "sharedDriver": "Жолооч",
+ "sharedArea": "Талбай",
+ "sharedSound": "Дуут дохио",
+ "sharedType": "Төрөл",
+ "sharedDistance": "Зай",
+ "sharedHourAbbreviation": "цаг",
+ "sharedMinuteAbbreviation": "мин",
+ "sharedSecondAbbreviation": "сек",
+ "sharedVoltAbbreviation": "Вольт",
+ "sharedLiterAbbreviation": "л",
+ "sharedGallonAbbreviation": "галлон",
+ "sharedLiter": "литр",
+ "sharedImpGallon": "Англи галлон",
+ "sharedUsGallon": "Америк галлон",
+ "sharedLiterPerHourAbbreviation": "литр/цаг",
+ "sharedGetMapState": "Зургийн нөхцөл хуулбарлах",
+ "sharedComputedAttribute": "Тооцолсон утга",
+ "sharedComputedAttributes": "Тооцолсон утганууд",
+ "sharedCheckComputedAttribute": "Тооцолсон утга шалгах",
+ "sharedExpression": "Илэрхийлэл",
+ "sharedDevice": "Төхөөрөмж",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Туршилтын мэдэгдэл илгээх",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Календар",
+ "sharedCalendars": "Календарууд",
+ "sharedFile": "Файл",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Файл сонгох",
+ "sharedPhone": "Утас",
+ "sharedRequired": "Шаардлагатай",
+ "sharedPreferences": "Тохиргоо",
+ "sharedPermissions": "Зөвшөөрөл",
+ "sharedConnections": "Холболт",
+ "sharedExtra": "Нэмэлт",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Бутархай утга",
+ "sharedTypeNumber": "Тоон утга",
+ "sharedTypeBoolean": "Логик утга",
+ "sharedTimezone": "Цагийн бүс",
+ "sharedInfoTitle": "Мэдээлэл",
+ "sharedSavedCommand": "Хадгалсан комманд",
+ "sharedSavedCommands": "Хадгалсан коммандууд",
+ "sharedNew": "Шинэ...",
+ "sharedShowAddress": "Хаягийг харуулах",
+ "sharedShowDetails": "Дэлгэрэнгүй мэдээлэл",
+ "sharedDisabled": "Хүчингүй",
+ "sharedMaintenance": "Засвар үйлчилгээ",
+ "sharedDeviceAccumulators": "Хуримтлагдах утга",
+ "sharedAlarms": "Дохиолол",
+ "sharedLocation": "Байрлал",
+ "sharedImport": "Оруулах",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Хурдны хязгаар",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Тайлан: Хянахын гүйлт тооцоохгүй",
+ "attributeWebReportColor": "Веб: Тайлангийн өнгө",
+ "attributeDevicePassword": "Төхөөрөмжийн нууц үг",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Төхөөрөмж Хэзээ унтсан",
+ "attributeDeviceInactivityPeriod": "Төхөөрөмж Унтсан хугацаа",
+ "attributeProcessingCopyAttributes": "Боловсруулж байна: Утга хуулж байна",
+ "attributeColor": "Өнгө",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Алдаа",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "Холболтын алдаа",
+ "errorSocket": "Web socket connection error",
+ "errorZero": "Нойл утга байж болохгүй",
+ "userEmail": "Имэйл",
+ "userPassword": "Нууц үг",
+ "userAdmin": "Админ",
+ "userRemember": "Санах",
+ "userExpirationTime": "Expiration",
+ "userDeviceLimit": "Device Limit",
+ "userUserLimit": "User Limit",
+ "userDeviceReadonly": "Device Readonly",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Нэвтрэх",
+ "loginLanguage": "Хэл",
+ "loginReset": "Нууц үг сэргээх",
+ "loginRegister": "Бүртгүүлэх",
+ "loginLogin": "Нэвтрэх",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Имэйл хаяг эсвэл нууц үг буруу байна",
+ "loginCreated": "Шинэ хэрэглэгч бүртгэгдлээ",
+ "loginResetSuccess": "Имэйлээ шалгана уу",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Системээс гарах",
+ "loginLogo": "Лого",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Devices and State",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Төхөөрөмжүүд",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifier",
+ "deviceModel": "Модел",
+ "deviceContact": "Contact",
+ "deviceCategory": "Category",
+ "deviceLastUpdate": "Last Update",
+ "deviceCommand": "Комманд",
+ "deviceFollow": "Follow",
+ "deviceTotalDistance": "Total Distance",
+ "deviceStatus": "Статус",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Unknown",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Бүлэг",
+ "groupParent": "Бүлэг",
+ "groupNoGroup": "No Group",
+ "settingsTitle": "Тохиргоонууд",
+ "settingsUser": "Account",
+ "settingsGroups": "Groups",
+ "settingsServer": "Сервер",
+ "settingsUsers": "Хэрэглэгчид",
+ "settingsDistanceUnit": "Зайн нэгж",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Хурдны нэгж",
+ "settingsVolumeUnit": "Эзэлхүүний нэгж",
+ "settingsTwelveHourFormat": "12-цагийн формат",
+ "settingsCoordinateFormat": "Coordinates Format",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Тайлангууд",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Төхөөрөмж",
+ "reportGroup": "Group",
+ "reportFrom": "From",
+ "reportTo": "To",
+ "reportShow": "Харуулах",
+ "reportClear": "Clear",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Valid",
+ "positionAccuracy": "Accuracy",
+ "positionLatitude": "Өргөрөг",
+ "positionLongitude": "Уртраг",
+ "positionAltitude": "Өндөр",
+ "positionSpeed": "Хурд",
+ "positionCourse": "Course",
+ "positionAddress": "Хаяг",
+ "positionProtocol": "Протокол",
+ "positionDistance": "Distance",
+ "positionRpm": "RPM",
+ "positionFuel": "Түлш",
+ "positionPower": "Power",
+ "positionBattery": "Батарей",
+ "positionRaw": "Raw",
+ "positionIndex": "Индекс",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Event",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Статус",
+ "positionOdometer": "Гүйлт",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hours",
+ "positionSteps": "Steps",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Battery Level",
+ "positionFuelConsumption": "Fuel Consumption",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Ignition",
+ "positionFlags": "Flags",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Motion",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Device Temperature",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Комманд",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Серверийн тохиргоо",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registration",
+ "serverReadonly": "Readonly",
+ "serverForceSettings": "Force Settings",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Map",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Map Layer",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polygon",
+ "mapShapeCircle": "Circle",
+ "mapShapePolyline": "Polyline",
+ "mapLiveRoutes": "Live Routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "State",
+ "stateName": "Attribute",
+ "stateValue": "Value",
+ "commandTitle": "Command",
+ "commandSend": "Send",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "Нэгж",
+ "commandCustom": "Custom command",
+ "commandDeviceIdentification": "Device Identification",
+ "commandPositionSingle": "Single Reporting",
+ "commandPositionPeriodic": "Periodic Reporting",
+ "commandPositionStop": "Stop Reporting",
+ "commandEngineStop": "Engine Stop",
+ "commandEngineResume": "Engine Resume",
+ "commandAlarmArm": "Arm Alarm",
+ "commandAlarmDisarm": "Disarm Alarm",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Set Timezone",
+ "commandRequestPhoto": "Request Photo",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Reboot Device",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Send SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "Set SOS Number",
+ "commandSilenceTime": "Set Silence Time",
+ "commandSetPhonebook": "Set Phonebook",
+ "commandVoiceMessage": "Voice Message",
+ "commandOutputControl": "Output Control",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Set Indicator",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frequency",
+ "commandTimezone": "Timezone Offset",
+ "commandMessage": "Message",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Data",
+ "commandIndex": "Index",
+ "commandPhone": "Phone Number",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "All Events",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Command result",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Maintenance required",
+ "eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Type of Notification",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Route",
+ "reportEvents": "Events",
+ "reportTrips": "Trips",
+ "reportStops": "Stops",
+ "reportSummary": "Summary",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Chart",
+ "reportConfigure": "Configure",
+ "reportEventTypes": "Event Types",
+ "reportChartType": "Chart Type",
+ "reportShowMarkers": "Show Markers",
+ "reportExport": "Export",
+ "reportEmail": "Имэйл тайлан",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Өнөөдөр",
+ "reportYesterday": "Өчигдөр",
+ "reportThisWeek": "Энэ долоо хоног",
+ "reportPreviousWeek": "Өмнөх долоо хоног",
+ "reportThisMonth": "Энэ сар",
+ "reportPreviousMonth": "Өмнөх сар",
+ "reportDeviceName": "Төхөөрөмжийн нэр",
+ "reportAverageSpeed": "Дундаж хурд",
+ "reportMaximumSpeed": "Дээд хурд",
+ "reportEngineHours": "Engine Hours",
+ "reportDuration": "Хугацаа",
+ "reportStartDate": "Эхлэх өдөр",
+ "reportStartTime": "Эхлэх цаг",
+ "reportStartAddress": "Start Address",
+ "reportEndTime": "End Time",
+ "reportEndAddress": "End Address",
+ "reportSpentFuel": "Spent Fuel",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Статистик",
+ "statisticsCaptureTime": "Capture Time",
+ "statisticsActiveUsers": "Идэвхитэй хэрэглэгчид",
+ "statisticsActiveDevices": "Идэвхитэй төхөөрөмжүүд",
+ "statisticsRequests": "Requests",
+ "statisticsMessagesReceived": "Messages Received",
+ "statisticsMessagesStored": "Messages Stored",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Arrow",
+ "categoryDefault": "Default",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicycle",
+ "categoryBoat": "Boat",
+ "categoryBus": "Bus",
+ "categoryCar": "Car",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "Motorcycle",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Plane",
+ "categoryShip": "Ship",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Truck",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ms.json b/legacy/web/l10n/ms.json
new file mode 100644
index 00000000..50b4048a
--- /dev/null
+++ b/legacy/web/l10n/ms.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Memuatkan...",
+ "sharedHide": "Hide",
+ "sharedSave": "Simpan",
+ "sharedUpload": "Upload",
+ "sharedSet": "Set",
+ "sharedCancel": "Batal",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Tambah",
+ "sharedEdit": "Ubah",
+ "sharedRemove": "Hapus",
+ "sharedRemoveConfirm": "Hapuskan item?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Jam",
+ "sharedMinute": "Minit",
+ "sharedSecond": "Saat",
+ "sharedDays": "days",
+ "sharedHours": "hours",
+ "sharedMinutes": "minutes",
+ "sharedDecimalDegrees": "Decimal Degrees",
+ "sharedDegreesDecimalMinutes": "Degrees Decimal Minutes",
+ "sharedDegreesMinutesSeconds": "Degrees Minutes Seconds",
+ "sharedName": "Name",
+ "sharedDescription": "Description",
+ "sharedSearch": "Search",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geofence",
+ "sharedGeofences": "Geofences",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Notifications",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "Attributes",
+ "sharedAttribute": "Attribute",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
+ "sharedArea": "Area",
+ "sharedSound": "Notification Sound",
+ "sharedType": "Type",
+ "sharedDistance": "Distance",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Get Map State",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "Expression",
+ "sharedDevice": "Device",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send Test Notification",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Calendar",
+ "sharedCalendars": "Calendars",
+ "sharedFile": "File",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Select File",
+ "sharedPhone": "Phone",
+ "sharedRequired": "Required",
+ "sharedPreferences": "Preferences",
+ "sharedPermissions": "Permissions",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Number",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Timezone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Speed Limit",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Report: Ignore Odometer",
+ "attributeWebReportColor": "Web: Report Color",
+ "attributeDevicePassword": "Device Password",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "Color",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Ralat",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "Ralat penyambungan",
+ "errorSocket": "Web socket connection error",
+ "errorZero": "Can't be zero",
+ "userEmail": "Emel",
+ "userPassword": "Katalaluan",
+ "userAdmin": "Admin",
+ "userRemember": "Remember",
+ "userExpirationTime": "Expiration",
+ "userDeviceLimit": "Device Limit",
+ "userUserLimit": "User Limit",
+ "userDeviceReadonly": "Device Readonly",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Log masuk",
+ "loginLanguage": "Bahasa",
+ "loginReset": "Reset Password",
+ "loginRegister": "Daftar",
+ "loginLogin": "Log masuk",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Kesalahan emel atau katalaluan",
+ "loginCreated": "Pengguna baru telah didaftarkan",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Keluar",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Peranti dan State",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Peranti",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "IMEI/ID",
+ "deviceModel": "Model",
+ "deviceContact": "Contact",
+ "deviceCategory": "Category",
+ "deviceLastUpdate": "Kemaskini Terakhir",
+ "deviceCommand": "Arahan",
+ "deviceFollow": "Ikut",
+ "deviceTotalDistance": "Total Distance",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Unknown",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Group",
+ "groupParent": "Group",
+ "groupNoGroup": "No Group",
+ "settingsTitle": "Tetapan",
+ "settingsUser": "Akaun",
+ "settingsGroups": "Groups",
+ "settingsServer": "Server",
+ "settingsUsers": "Pengguna",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "12-hour Format",
+ "settingsCoordinateFormat": "Coordinates Format",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Laporan",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Peranti",
+ "reportGroup": "Group",
+ "reportFrom": "Daripada",
+ "reportTo": "Ke",
+ "reportShow": "Papar",
+ "reportClear": "Kosongkan",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Sah",
+ "positionAccuracy": "Accuracy",
+ "positionLatitude": "Latitud",
+ "positionLongitude": "Longitud",
+ "positionAltitude": "Altitud",
+ "positionSpeed": "Kelajuan",
+ "positionCourse": "Course",
+ "positionAddress": "Alamat",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Distance",
+ "positionRpm": "RPM",
+ "positionFuel": "Fuel",
+ "positionPower": "Power",
+ "positionBattery": "Battery",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Event",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hours",
+ "positionSteps": "Steps",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Battery Level",
+ "positionFuelConsumption": "Fuel Consumption",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Ignition",
+ "positionFlags": "Flags",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Motion",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Device Temperature",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Command",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Tetapan Server",
+ "serverZoom": "Besarkan",
+ "serverRegistration": "Pendaftaran",
+ "serverReadonly": "Baca Sahaja",
+ "serverForceSettings": "Force Settings",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Peta",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Map Layer",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polygon",
+ "mapShapeCircle": "Circle",
+ "mapShapePolyline": "Polyline",
+ "mapLiveRoutes": "Live Routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Negeri",
+ "stateName": "Atribut",
+ "stateValue": "Nilai",
+ "commandTitle": "Arahan",
+ "commandSend": "Hantar",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "Unit",
+ "commandCustom": "Custom command",
+ "commandDeviceIdentification": "Device Identification",
+ "commandPositionSingle": "Single Reporting",
+ "commandPositionPeriodic": "Laporan Berkala",
+ "commandPositionStop": "Hentikan Laporan",
+ "commandEngineStop": "Matikan Enjin",
+ "commandEngineResume": "Hidupkan Enjin",
+ "commandAlarmArm": "Arm Alarm",
+ "commandAlarmDisarm": "Disarm Alarm",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Set Timezone",
+ "commandRequestPhoto": "Request Photo",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Reboot Device",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Send SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "Set SOS Number",
+ "commandSilenceTime": "Set Silence Time",
+ "commandSetPhonebook": "Set Phonebook",
+ "commandVoiceMessage": "Voice Message",
+ "commandOutputControl": "Output Control",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Set Indicator",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekuensi",
+ "commandTimezone": "Timezone Offset",
+ "commandMessage": "Message",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Data",
+ "commandIndex": "Index",
+ "commandPhone": "Phone Number",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "All Events",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Command result",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Maintenance required",
+ "eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Type of Notification",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Route",
+ "reportEvents": "Events",
+ "reportTrips": "Trips",
+ "reportStops": "Stops",
+ "reportSummary": "Summary",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Chart",
+ "reportConfigure": "Configure",
+ "reportEventTypes": "Event Types",
+ "reportChartType": "Chart Type",
+ "reportShowMarkers": "Show Markers",
+ "reportExport": "Export",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "Device Name",
+ "reportAverageSpeed": "Average Speed",
+ "reportMaximumSpeed": "Maximum Speed",
+ "reportEngineHours": "Engine Hours",
+ "reportDuration": "Duration",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Start Time",
+ "reportStartAddress": "Start Address",
+ "reportEndTime": "End Time",
+ "reportEndAddress": "End Address",
+ "reportSpentFuel": "Spent Fuel",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Statistics",
+ "statisticsCaptureTime": "Capture Time",
+ "statisticsActiveUsers": "Active Users",
+ "statisticsActiveDevices": "Active Devices",
+ "statisticsRequests": "Requests",
+ "statisticsMessagesReceived": "Messages Received",
+ "statisticsMessagesStored": "Messages Stored",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Arrow",
+ "categoryDefault": "Default",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicycle",
+ "categoryBoat": "Boat",
+ "categoryBus": "Bus",
+ "categoryCar": "Car",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "Motorcycle",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Plane",
+ "categoryShip": "Ship",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Truck",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/nb.json b/legacy/web/l10n/nb.json
new file mode 100644
index 00000000..a3faa8c0
--- /dev/null
+++ b/legacy/web/l10n/nb.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Laster...",
+ "sharedHide": "Skjul",
+ "sharedSave": "Lagre",
+ "sharedUpload": "Upload",
+ "sharedSet": "Sett",
+ "sharedCancel": "Avbryt",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Legg til",
+ "sharedEdit": "Endre",
+ "sharedRemove": "Fjern",
+ "sharedRemoveConfirm": "Fjern element?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nm",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/t",
+ "sharedMph": "mph",
+ "sharedHour": "Time",
+ "sharedMinute": "Minutt",
+ "sharedSecond": "Sekund",
+ "sharedDays": "dager",
+ "sharedHours": "timer",
+ "sharedMinutes": "minutter",
+ "sharedDecimalDegrees": "Desimalgrader",
+ "sharedDegreesDecimalMinutes": "Grader desimalminutter",
+ "sharedDegreesMinutesSeconds": "Grader minutter sekund",
+ "sharedName": "Navn",
+ "sharedDescription": "Beskrivelse",
+ "sharedSearch": "Søk",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "geo-gjerde",
+ "sharedGeofences": "Geo-gjerder",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Varsler",
+ "sharedNotification": "Varsel",
+ "sharedAttributes": "Atributter",
+ "sharedAttribute": "Egenskap",
+ "sharedDrivers": "Sjåfører",
+ "sharedDriver": "Sjåfør",
+ "sharedArea": "Område",
+ "sharedSound": "Varslingslyd",
+ "sharedType": "Type",
+ "sharedDistance": "Avstand",
+ "sharedHourAbbreviation": "t",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Britisk Gallon",
+ "sharedUsGallon": "Amerikansk Gallon",
+ "sharedLiterPerHourAbbreviation": "l/t",
+ "sharedGetMapState": "Få karttilstand",
+ "sharedComputedAttribute": "Utregnede atributter",
+ "sharedComputedAttributes": "Utregnede atributter",
+ "sharedCheckComputedAttribute": "Sjekk utregnede atributter",
+ "sharedExpression": "Uttrykk",
+ "sharedDevice": "Enhet",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send testvarsling",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Kalender",
+ "sharedCalendars": "Kalendere",
+ "sharedFile": "Fil",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Velg fil",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Nødvendig",
+ "sharedPreferences": "Innstillinger",
+ "sharedPermissions": "Tilgang",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Ekstra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Streng",
+ "sharedTypeNumber": "Nummer",
+ "sharedTypeBoolean": "Boolsk",
+ "sharedTimezone": "Tidssone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Lagret kommando",
+ "sharedSavedCommands": "Lagrede kommandoer",
+ "sharedNew": "Ny",
+ "sharedShowAddress": "Vis adresse",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Deaktivert",
+ "sharedMaintenance": "Vedlikehold",
+ "sharedDeviceAccumulators": "Målere",
+ "sharedAlarms": "Alarmer",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Fartsgrense",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polylinjedistanse",
+ "attributeReportIgnoreOdometer": "Rapport: Ignorer odometer",
+ "attributeWebReportColor": "Web: Rapport farge",
+ "attributeDevicePassword": "Enhetspassord",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Behandling: Kopier egenskaper",
+ "attributeColor": "Farge",
+ "attributeWebLiveRouteLength": "Web: Live rute lengde",
+ "attributeWebSelectZoom": "Web: Skaler ved valg",
+ "attributeWebMaxZoom": "Web: Maksimal forstørring",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP-vert",
+ "attributeMailSmtpPort": "Mail: SMTP-port",
+ "attributeMailSmtpStarttlsEnable": "Mail: Aktiver SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS påkrevd",
+ "attributeMailSmtpSslEnable": "Mail: Aktiver SMTP SSL",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL tillit",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL protokoller",
+ "attributeMailSmtpFrom": "Mail: SMTP Fra",
+ "attributeMailSmtpAuth": "E-post: Aktiver SMTP autentisering",
+ "attributeMailSmtpUsername": "Mail: SMTP brukernavn",
+ "attributeMailSmtpPassword": "Mail: SMTP passord",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Deaktiver hendelser",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Deaktiver sjåfører",
+ "attributeUiDisableComputedAttributes": "UI: Deaktiver utregnede egenskaper",
+ "attributeUiDisableCalendars": "UI: Deaktiver kalendere",
+ "attributeUiDisableMaintenance": "UI: Deaktiver Vedlikehold",
+ "attributeUiHidePositionAttributes": "UI: Skjul posisjonsegenskaper",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Feil",
+ "errorGeneral": "Ugyldige parametere eller begrensingsbrudd",
+ "errorConnection": "Forbindelse feilet",
+ "errorSocket": "Web socket tilkoblingsfeil",
+ "errorZero": "Kan ikke være null",
+ "userEmail": "E-post",
+ "userPassword": "Passord",
+ "userAdmin": "Admin",
+ "userRemember": "Husk",
+ "userExpirationTime": "Utløpstid",
+ "userDeviceLimit": "Enhetsgrense",
+ "userUserLimit": "Brukergrense",
+ "userDeviceReadonly": "Skrivebeskyttet enhet",
+ "userLimitCommands": "Begrens kommandoer",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Symbol",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Logg inn",
+ "loginLanguage": "Språk",
+ "loginReset": "Reset Password",
+ "loginRegister": "Registrer",
+ "loginLogin": "Logg inn",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Feil e-post eller passord",
+ "loginCreated": "Ny bruker har blitt registrert",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Logg ut",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Enheter og status",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Enheter",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifikator",
+ "deviceModel": "Modell",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategori",
+ "deviceLastUpdate": "Sist oppdatert",
+ "deviceCommand": "Kommando",
+ "deviceFollow": "Følg",
+ "deviceTotalDistance": "Total distanse",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Tilkoblet",
+ "deviceStatusOffline": "Frakoblet",
+ "deviceStatusUnknown": "Ukjent",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Gruppe",
+ "groupParent": "Gruppe",
+ "groupNoGroup": "Ingen gruppe",
+ "settingsTitle": "Innstillinger",
+ "settingsUser": "Konto",
+ "settingsGroups": "Grupper",
+ "settingsServer": "Server",
+ "settingsUsers": "Brukere",
+ "settingsDistanceUnit": "Avstandsenhet",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Hastighetsenhet",
+ "settingsVolumeUnit": "Volumenhet",
+ "settingsTwelveHourFormat": "Tolvtimersformat",
+ "settingsCoordinateFormat": "Koordinatformat",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Rapporter",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Enhet",
+ "reportGroup": "Gruppe",
+ "reportFrom": "Fra",
+ "reportTo": "Til",
+ "reportShow": "Vis",
+ "reportClear": "Nullstill",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Gyldig",
+ "positionAccuracy": "Nøyaktighet",
+ "positionLatitude": "Breddegrad",
+ "positionLongitude": "Lengdegrad",
+ "positionAltitude": "Høyde",
+ "positionSpeed": "Hastighet",
+ "positionCourse": "Retning",
+ "positionAddress": "Adresse",
+ "positionProtocol": "Protokoll",
+ "positionDistance": "Avstand",
+ "positionRpm": "r/min",
+ "positionFuel": "Drivstoff",
+ "positionPower": "Spenning",
+ "positionBattery": "Batteri",
+ "positionRaw": "Rå",
+ "positionIndex": "Register",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelitter",
+ "positionSatVisible": "Synlige satelitter",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Nettveksling (Roaming)",
+ "positionEvent": "Hendelse",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Kilometerteller",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Turmåler",
+ "positionHours": "Timer",
+ "positionSteps": "Steg",
+ "positionInput": "Inngang",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Utgang",
+ "positionBatteryLevel": "Batterinivå",
+ "positionFuelConsumption": "Drivstofforbruk",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Fastvareversjon",
+ "positionVersionHw": "Maskinvareversjon",
+ "positionIgnition": "Tenning",
+ "positionFlags": "Status indikatorer",
+ "positionCharge": "Lade",
+ "positionIp": "IP",
+ "positionArchive": "Arkiv",
+ "positionVin": "VIN",
+ "positionApproximate": "Tilnærmet",
+ "positionThrottle": "Gasspedal",
+ "positionMotion": "Bevegelse",
+ "positionArmed": "Slått På",
+ "positionAcceleration": "Akselerasjon",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Enhetstemperatur",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operatør",
+ "positionCommand": "Kommando",
+ "positionBlocked": "Blokkert",
+ "positionDtcs": "Diagnosefeilkoder",
+ "positionObdSpeed": "OBD hastighet",
+ "positionObdOdometer": "OBD kilometerteller",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Sjåførunik ID",
+ "positionCard": "Card",
+ "positionImage": "Bilde",
+ "positionVideo": "Video",
+ "positionAudio": "Lyd",
+ "serverTitle": "Serverinnstillinger",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registering",
+ "serverReadonly": "Skrivebeskyttet",
+ "serverForceSettings": "Tving innstillinger",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Kart",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Kartlag",
+ "mapCustom": "Tilpasset (XYZ)",
+ "mapCustomArcgis": "Tilpasset (ArcGIS)",
+ "mapCustomLabel": "Tilpasset kart",
+ "mapCarto": "Carto basiskart",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps-nøkkel",
+ "mapBingRoad": "Bing Maps-veg",
+ "mapBingAerial": "Bing Maps-flyfoto",
+ "mapBingHybrid": "Bing Kart Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satelitt",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Mangekant",
+ "mapShapeCircle": "Sirkel",
+ "mapShapePolyline": "Polylinje",
+ "mapLiveRoutes": "Live rute",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI-lag",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Status",
+ "stateName": "Egenskap",
+ "stateValue": "Verdi",
+ "commandTitle": "Kommando",
+ "commandSend": "Send",
+ "commandSent": "Kommando er sent",
+ "commandQueued": "Kommando er satt i kø",
+ "commandUnit": "Enhet",
+ "commandCustom": "Egendefinert kommando",
+ "commandDeviceIdentification": "Enhetsidentifikasjon",
+ "commandPositionSingle": "Enkel-rapportering",
+ "commandPositionPeriodic": "Periodisk rapportering",
+ "commandPositionStop": "Stopp rapportering",
+ "commandEngineStop": "Stopp motor",
+ "commandEngineResume": "Fortsett motor",
+ "commandAlarmArm": "Slå alarm på",
+ "commandAlarmDisarm": "Slå alarm av",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Sett tidssone",
+ "commandRequestPhoto": "Be om foto",
+ "commandPowerOff": "Skru av enhet",
+ "commandRebootDevice": "Omstart enhet",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Send SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "Sett SOS-nummer",
+ "commandSilenceTime": "Sett stilletid",
+ "commandSetPhonebook": "Sett telefonbok",
+ "commandVoiceMessage": "Talemelding",
+ "commandOutputControl": "Utgangkontroll",
+ "commandVoiceMonitoring": "Stemmeovervåking",
+ "commandSetAgps": "Sett AGPS",
+ "commandSetIndicator": "Sett Indikator",
+ "commandConfiguration": "Oppsett",
+ "commandGetVersion": "Vis versjon",
+ "commandFirmwareUpdate": "Oppdater fastvare",
+ "commandSetConnection": "Angi tilkobling",
+ "commandSetOdometer": "Angi kilometerteller",
+ "commandGetModemStatus": "Få modemtilstand",
+ "commandGetDeviceStatus": "Få enhetstilstand",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekvens",
+ "commandTimezone": "Tidszoneforskyvning",
+ "commandMessage": "Melding",
+ "commandRadius": "Radius",
+ "commandEnable": "Aktiver",
+ "commandData": "Data",
+ "commandIndex": "Register",
+ "commandPhone": "Telefonnummer",
+ "commandServer": "Tjener",
+ "commandPort": "Port",
+ "eventAll": "Alle hendelser",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Enhetsstatus ukjent",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Enheten beveger seg",
+ "eventDeviceStopped": "Enhet stoppet",
+ "eventDeviceOverspeed": "Fartsgrense overskredet",
+ "eventDeviceFuelDrop": "Drivstoffall",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Kommandoresultat",
+ "eventGeofenceEnter": "Ankommet geogjerde",
+ "eventGeofenceExit": "Forlatt geogjerde",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Tenning på",
+ "eventIgnitionOff": "Tenning av",
+ "eventMaintenance": "Vedlikehold Kreves",
+ "eventTextMessage": "Tekst melding mottatt",
+ "eventDriverChanged": "Sjåfør endret",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Vis siste",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Generell",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibrasjon",
+ "alarmMovement": "Bevegelse",
+ "alarmLowspeed": "Lav hastighet",
+ "alarmOverspeed": "Høgt turtall",
+ "alarmFallDown": "Fall",
+ "alarmLowPower": "Lite strøm",
+ "alarmLowBattery": "Lavt batterinivå",
+ "alarmFault": "Feil",
+ "alarmPowerOff": "Spenning av",
+ "alarmPowerOn": "Spenning På",
+ "alarmDoor": "Dør",
+ "alarmLock": "Lås",
+ "alarmUnlock": "lås opp",
+ "alarmGeofence": "Geo-gjerde",
+ "alarmGeofenceEnter": "Ankommet Geogjerde",
+ "alarmGeofenceExit": "Forlatt Geogjerde",
+ "alarmGpsAntennaCut": "GPS-Antenne Fjernet",
+ "alarmAccident": "Ulykke",
+ "alarmTow": "Tauing",
+ "alarmIdle": "Tomgang",
+ "alarmHighRpm": "Høyt turtall",
+ "alarmHardAcceleration": "Hard Akselerasjon",
+ "alarmHardBraking": "Hard Oppbremsing",
+ "alarmHardCornering": "Hard svingning",
+ "alarmLaneChange": "Filskifte",
+ "alarmFatigueDriving": "Tretthetskjøring",
+ "alarmPowerCut": "Spenning Kuttet",
+ "alarmPowerRestored": "Spenning Gjenopprettet",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Tempratur",
+ "alarmParking": "Parkering",
+ "alarmBonnet": "Panser",
+ "alarmFootBrake": "Bremsepedal",
+ "alarmFuelLeak": "Drivstofflekasje",
+ "alarmTampering": "Tukling",
+ "alarmRemoving": "Fjerner",
+ "notificationType": "Varseltype",
+ "notificationAlways": "Alle enheter",
+ "notificationNotificators": "Kanaler",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Rute",
+ "reportEvents": "Hendelser",
+ "reportTrips": "Turer",
+ "reportStops": "Stopp",
+ "reportSummary": "Oppsumering",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Diagram",
+ "reportConfigure": "Sett opp",
+ "reportEventTypes": "Hendelsestyper",
+ "reportChartType": "Diagramtype",
+ "reportShowMarkers": "Vis markører",
+ "reportExport": "Eksporter",
+ "reportEmail": "E-post-rapport",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Periode",
+ "reportCustom": "Egendefinert",
+ "reportToday": "Idag",
+ "reportYesterday": "I går",
+ "reportThisWeek": "Denne uken",
+ "reportPreviousWeek": "Forrige uke",
+ "reportThisMonth": "Denne måneden",
+ "reportPreviousMonth": "Forrige måned",
+ "reportDeviceName": "Enhetsnavn",
+ "reportAverageSpeed": "Gjennomsnittshastighet ",
+ "reportMaximumSpeed": "Maksimumshastighet",
+ "reportEngineHours": "Motortimer",
+ "reportDuration": "Varighet",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Starttidspunkt",
+ "reportStartAddress": "Startadresse",
+ "reportEndTime": "Sluttidspunkt",
+ "reportEndAddress": "Sluttadresse",
+ "reportSpentFuel": "Brukt drivstoff",
+ "reportStartOdometer": "Kilometerteller start",
+ "reportEndOdometer": "Kilometerteller stopp",
+ "statisticsTitle": "Statistikk",
+ "statisticsCaptureTime": "Opptakstidspunkt",
+ "statisticsActiveUsers": "Aktive brukere",
+ "statisticsActiveDevices": "Aktive enheter",
+ "statisticsRequests": "Forespørsler",
+ "statisticsMessagesReceived": "Meldinger mottatt",
+ "statisticsMessagesStored": "Meldinger lagret",
+ "statisticsGeocoder": "Geocoder-forespørsler",
+ "statisticsGeolocation": "Geolocation-forespørsler",
+ "categoryArrow": "Pil",
+ "categoryDefault": "Standard",
+ "categoryAnimal": "Dyr",
+ "categoryBicycle": "Sykkel",
+ "categoryBoat": "Båt",
+ "categoryBus": "Buss",
+ "categoryCar": "Bil",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Kran",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motorsykkel",
+ "categoryOffroad": "Terrengkjøretøy",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Fly",
+ "categoryShip": "Skip",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Tog",
+ "categoryTram": "Trikk",
+ "categoryTrolleybus": "Strømbuss",
+ "categoryTruck": "Lastebil",
+ "categoryVan": "Varebil",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Periode"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ne.json b/legacy/web/l10n/ne.json
new file mode 100644
index 00000000..0c89df5d
--- /dev/null
+++ b/legacy/web/l10n/ne.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "लोड हुँदै ",
+ "sharedHide": "लुकाउने ",
+ "sharedSave": "सुरक्षित गर्ने ",
+ "sharedUpload": "Upload",
+ "sharedSet": "सेट गर्ने ",
+ "sharedCancel": "रद्ध गर्ने ",
+ "sharedCopy": "Copy",
+ "sharedAdd": "थप्ने",
+ "sharedEdit": "सच्याउने",
+ "sharedRemove": "हटाउने ",
+ "sharedRemoveConfirm": "हटाउने हो?",
+ "sharedNoData": "डाटा छैन",
+ "sharedSubject": "Subject",
+ "sharedYes": "हो",
+ "sharedNo": "छैन",
+ "sharedKm": "कि मि ",
+ "sharedMi": "माइल",
+ "sharedNmi": "नटिकल माइल",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "किलो नट ",
+ "sharedKmh": "कि मि /घण्टा ",
+ "sharedMph": "माइल /घण्टा ",
+ "sharedHour": "घण्टा ",
+ "sharedMinute": "मिनेट ",
+ "sharedSecond": "सेकेन्ड ",
+ "sharedDays": "दिन ",
+ "sharedHours": "घण्टा ",
+ "sharedMinutes": "मिनेट",
+ "sharedDecimalDegrees": "डेसिमल डिग्री ",
+ "sharedDegreesDecimalMinutes": "डिग्री डेसिमल मिनेट ",
+ "sharedDegreesMinutesSeconds": "डिग्री मिनेट सेकेन्ड ",
+ "sharedName": "नाम ",
+ "sharedDescription": "विवरण ",
+ "sharedSearch": "खोज्ने ",
+ "sharedIconScale": "आइकन स्केल",
+ "sharedGeofence": "भू परिधि ",
+ "sharedGeofences": "भू परिधिहरू ",
+ "sharedCreateGeofence": "geofence सिर्जना गर्नुहोस्",
+ "sharedNotifications": "सूचनाहरु ",
+ "sharedNotification": "सूचना ",
+ "sharedAttributes": "विशेषताहरू",
+ "sharedAttribute": "विशेषता",
+ "sharedDrivers": "चालकहरु ",
+ "sharedDriver": "चालक ",
+ "sharedArea": "क्षेत्र ",
+ "sharedSound": "सूचना ध्वनि ",
+ "sharedType": "प्रकार ",
+ "sharedDistance": "दूरी ",
+ "sharedHourAbbreviation": "घ ",
+ "sharedMinuteAbbreviation": "मि",
+ "sharedSecondAbbreviation": "से ",
+ "sharedVoltAbbreviation": "भोल्ट ",
+ "sharedLiterAbbreviation": "ई",
+ "sharedGallonAbbreviation": "ग्या",
+ "sharedLiter": "लिटर ",
+ "sharedImpGallon": "ग्यालन ",
+ "sharedUsGallon": "अमेरिकी ग्यालन ",
+ "sharedLiterPerHourAbbreviation": "ई/घ",
+ "sharedGetMapState": "नक्साको स्थिति पाउने ",
+ "sharedComputedAttribute": "गणना गरिएको विशेषता",
+ "sharedComputedAttributes": "गणना गरिएको विशेषताहरू",
+ "sharedCheckComputedAttribute": "गणना गरिएको विशेषता जाँच गर्नुहोस्",
+ "sharedExpression": "अभिव्यक्ति",
+ "sharedDevice": "यन्त्र ",
+ "sharedTest": "परीक्षण",
+ "sharedTestNotification": "परीक्षण सूचना पठाउनुहोस्",
+ "sharedTestNotificators": "परीक्षण च्यानलहरू",
+ "sharedTestExpression": "परीक्षण अभिव्यक्ति",
+ "sharedCalendar": "पात्रो",
+ "sharedCalendars": "पात्रोहरू",
+ "sharedFile": "फाइल",
+ "sharedSearchDevices": "खोज उपकरण",
+ "sharedSortBy": "द्वारा क्रमबद्ध",
+ "sharedFilterMap": "नक्सामा फिल्टर गर्नुहोस्",
+ "sharedSelectFile": "फाइल चयन गर्नुहोस्",
+ "sharedPhone": "फोन",
+ "sharedRequired": "आवश्यक छ",
+ "sharedPreferences": "प्राथमिकताहरू",
+ "sharedPermissions": "अनुमतिहरू",
+ "sharedConnections": "जडानहरू",
+ "sharedExtra": "अतिरिक्त",
+ "sharedPrimary": "प्राथमिक",
+ "sharedSecondary": "माध्यमिक",
+ "sharedTypeString": "स्ट्रिंग",
+ "sharedTypeNumber": "संख्या",
+ "sharedTypeBoolean": "बूलियन",
+ "sharedTimezone": "समय क्षेत्र",
+ "sharedInfoTitle": "जानकारी",
+ "sharedSavedCommand": "संचित आदेश",
+ "sharedSavedCommands": "संचित आदेशहरू",
+ "sharedNew": "नयाँ...",
+ "sharedShowAddress": "ठेगाना देखाउनुहोस्",
+ "sharedShowDetails": "थप विवरण",
+ "sharedDisabled": "अक्षम",
+ "sharedMaintenance": "मर्मत",
+ "sharedDeviceAccumulators": "सञ्चयकर्ताहरू",
+ "sharedAlarms": "अलार्म",
+ "sharedLocation": "स्थान",
+ "sharedImport": "आयात",
+ "sharedColumns": "स्तम्भहरू",
+ "sharedDropzoneText": "यहाँ एउटा फाइल तान्नुहोस् र छोड्नुहोस् वा क्लिक गर्नुहोस्",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "सरल",
+ "calendarRecurrence": "पुनरावृत्ति",
+ "calendarOnce": "एक पटक",
+ "calendarDaily": "दैनिक",
+ "calendarWeekly": "साप्ताहिक",
+ "calendarMonthly": "मासिक",
+ "calendarDays": "दिनहरू",
+ "calendarSunday": "आइतबार",
+ "calendarMonday": "सोमबार",
+ "calendarTuesday": "मंगलबार",
+ "calendarWednesday": "बुधबार",
+ "calendarThursday": "बिहीबार",
+ "calendarFriday": "शुक्रबार",
+ "calendarSaturday": "शनिबार",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "गति सिमित",
+ "attributeFuelDropThreshold": "इन्धन ड्रप थ्रेसहोल्ड",
+ "attributeFuelIncreaseThreshold": "इन्धन वृद्धि थ्रेसहोल्ड",
+ "attributePolylineDistance": "बहुरेखा दूरि",
+ "attributeReportIgnoreOdometer": "प्रतिबेदन: ओडोमिटर वेवास्ता",
+ "attributeWebReportColor": "वेब: प्रतिबेदन रङ्ग",
+ "attributeDevicePassword": "यन्त्र गोप्य शब्द",
+ "attributeDeviceImage": "उपकरण फोटो",
+ "attributeDeviceInactivityStart": "यन्त्र निष्क्रियता सुरु",
+ "attributeDeviceInactivityPeriod": "यन्त्र निष्क्रियता अवधि",
+ "attributeProcessingCopyAttributes": "प्रशोधन: प्रतिलिपि विशेषताहरू",
+ "attributeColor": "रङ्ग",
+ "attributeWebLiveRouteLength": "वेब: प्रत्यक्ष मार्ग लम्बाई",
+ "attributeWebSelectZoom": "वेब: जूम अन चयन गर्नुहोस्",
+ "attributeWebMaxZoom": "वेब: अधिकतम जुम",
+ "attributeTelegramChatId": "टेलिग्राम च्याट आईडी",
+ "attributePushoverUserKey": "Pushover प्रयोगकर्ता कुञ्जी",
+ "attributePushoverDeviceNames": "Pushover उपकरण नामहरू",
+ "attributeMailSmtpHost": "मेल: SMTP होस्ट",
+ "attributeMailSmtpPort": "मेल: SMTP पोर्ट",
+ "attributeMailSmtpStarttlsEnable": "मेल: SMTP STARTTLS सक्षम गर्नुहोस्",
+ "attributeMailSmtpStarttlsRequired": "मेल: SMTP STARTTLS आवश्यक छ",
+ "attributeMailSmtpSslEnable": "मेल: SMTP SSL सक्षम गर्नुहोस्",
+ "attributeMailSmtpSslTrust": "मेल: SMTP SSL ट्रस्ट",
+ "attributeMailSmtpSslProtocols": "मेल: SMTP SSL प्रोटोकलहरू",
+ "attributeMailSmtpFrom": "मेल: SMTP बाट",
+ "attributeMailSmtpAuth": "मेल: SMTP प्रमाणीकरण सक्षम गर्नुहोस्",
+ "attributeMailSmtpUsername": "मेल: SMTP प्रयोगकर्ता नाम",
+ "attributeMailSmtpPassword": "मेल: SMTP पासवर्ड",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: विशेषताहरू असक्षम गर्नुहोस्",
+ "attributeUiDisableGroups": "UI: समूहहरू असक्षम पार्नुहोस्",
+ "attributeUiDisableEvents": "UI: अक्षम घटनाहरू",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: अक्षम ड्राईभरहरू",
+ "attributeUiDisableComputedAttributes": "UI: गणना गरिएका विशेषताहरू असक्षम पार्नुहोस्",
+ "attributeUiDisableCalendars": "UI: अक्षम पात्रो",
+ "attributeUiDisableMaintenance": "UI: अक्षम मर्मत",
+ "attributeUiHidePositionAttributes": "UI: स्थिति विशेषताहरू लुकाउनुहोस्",
+ "attributeUiDisableLoginLanguage": "UI: लगइन भाषा असक्षम गर्नुहोस्",
+ "attributeNotificationTokens": "सूचना टोकनहरू",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "त्रुटी",
+ "errorGeneral": "अवैध प्यारामिटर वा बाधा उल्लङ्घन",
+ "errorConnection": "जडान मा त्रुटी भयो ",
+ "errorSocket": "वेब सकेट जडान त्रुटि",
+ "errorZero": "शून्य हुन सक्दैन",
+ "userEmail": "इ मेल ",
+ "userPassword": "गोप्य शब्द ",
+ "userAdmin": "ब्यबस्थापक",
+ "userRemember": "सम्झनु",
+ "userExpirationTime": "मिति समाप्ति",
+ "userDeviceLimit": "यन्त्र सिमित",
+ "userUserLimit": "प्रयोगकर्ता सिमित",
+ "userDeviceReadonly": "यन्त्र पढ्ने मात्र",
+ "userLimitCommands": "सिमित आदेशहरू",
+ "userDisableReports": "रिपोर्टहरू असक्षम गर्नुहोस्",
+ "userFixedEmail": "कुनै इमेल परिवर्तन छैन",
+ "userToken": "टोकन",
+ "userDeleteAccount": "खाता मेटाउनुहोस्",
+ "userTemporary": "Temporary",
+ "loginTitle": "लगिन गर्ने ",
+ "loginLanguage": "भाषा ",
+ "loginReset": "पासवर्ड रिसेट",
+ "loginRegister": "दर्ता गर्ने",
+ "loginLogin": "भित्रिने ",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "इ मेल वा गोप्य शब्द गलत भयो ",
+ "loginCreated": "नया प्रयोगकर्ता दर्ता भयो ",
+ "loginResetSuccess": "आफ्नो इमेल जाँच गर्नुहोस्",
+ "loginUpdateSuccess": "नयाँ पासवर्ड सेट गरिएको छ",
+ "loginLogout": "बाहिरिने ",
+ "loginLogo": "लोगो",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "यन्त्रहरू तथा अवस्था ",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "यन्त्रहरू ",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "परिचायक ",
+ "deviceModel": "मोडेल",
+ "deviceContact": "सम्पर्क गर्नुहोस्",
+ "deviceCategory": "वर्ग",
+ "deviceLastUpdate": "अन्तिम अपडेट ",
+ "deviceCommand": "आदेश ",
+ "deviceFollow": "पिछा गर्ने ",
+ "deviceTotalDistance": "कुल दूरि",
+ "deviceStatus": "स्थिति",
+ "deviceStatusOnline": "अनलाईन",
+ "deviceStatusOffline": "अफलाईन",
+ "deviceStatusUnknown": "अज्ञात",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "समुह",
+ "groupParent": "समुह",
+ "groupNoGroup": "समुह नभएको",
+ "settingsTitle": "सेटिङ्ग ",
+ "settingsUser": "खाता ",
+ "settingsGroups": "समुहहरू",
+ "settingsServer": "सर्भर ",
+ "settingsUsers": "प्रयोगकर्ताहरु ",
+ "settingsDistanceUnit": "दूरि एकाई",
+ "settingsAltitudeUnit": "उचाई एकाइ",
+ "settingsSpeedUnit": "गति एकाई",
+ "settingsVolumeUnit": "आयातन एकाई",
+ "settingsTwelveHourFormat": "12-घण्टे ढाचाँ",
+ "settingsCoordinateFormat": "निर्देशांक ढाचाँ",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "प्रतिबेदनहरु ",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "यन्त्र ",
+ "reportGroup": "समुह",
+ "reportFrom": "बाट ",
+ "reportTo": "सम्म ",
+ "reportShow": "देखाउने ",
+ "reportClear": "सफा गर्ने ",
+ "linkGoogleMaps": "गुगल नक्शा",
+ "linkAppleMaps": "एप्पल नक्शा",
+ "linkStreetView": "सडक दृश्य",
+ "positionFixTime": "समय तय गर्नुहोस्",
+ "positionDeviceTime": "उपकरण समय",
+ "positionServerTime": "सर्भर समय",
+ "positionValid": "ठिक",
+ "positionAccuracy": "शुद्धता",
+ "positionLatitude": "अक्षांश",
+ "positionLongitude": "देशान्तर ",
+ "positionAltitude": "उचाई ",
+ "positionSpeed": "गति ",
+ "positionCourse": "दिशा ",
+ "positionAddress": "ठेगाना ",
+ "positionProtocol": "प्रोटोकल ",
+ "positionDistance": "दूरि",
+ "positionRpm": "RPM",
+ "positionFuel": "ईन्धन",
+ "positionPower": "शक्ति",
+ "positionBattery": "ब्याट्री",
+ "positionRaw": "कच्चा",
+ "positionIndex": "अनुक्रमणिका",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "भू-उपग्रहहरू",
+ "positionSatVisible": "देखिने भू-उपग्रहहरू",
+ "positionRssi": "RSSI",
+ "positionGps": "जिपियस्",
+ "positionRoaming": "Roaming",
+ "positionEvent": "घटना",
+ "positionAlarm": "अलार्म",
+ "positionStatus": "स्थिति",
+ "positionOdometer": "ओडोमिटर",
+ "positionServiceOdometer": "Service ओडोमीटर",
+ "positionTripOdometer": "ट्रिप ओडोमीटर",
+ "positionHours": "घण्टा",
+ "positionSteps": "पाइलाहरू",
+ "positionInput": "निवेश",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "आउटपुट",
+ "positionBatteryLevel": "ब्याट्री स्तर",
+ "positionFuelConsumption": "इन्धन खपत",
+ "positionRfid": "RFID",
+ "positionVersionFw": "फर्मवेयर संस्करण",
+ "positionVersionHw": "हार्डवेयर संस्करण",
+ "positionIgnition": "प्रज्वलन",
+ "positionFlags": "झण्डाहरू",
+ "positionCharge": "चार्ज",
+ "positionIp": "IP",
+ "positionArchive": "अभिलेख",
+ "positionVin": "VIN",
+ "positionApproximate": "अनुमान",
+ "positionThrottle": "थ्रोटल",
+ "positionMotion": "गति",
+ "positionArmed": "सशस्त्र",
+ "positionAcceleration": "प्रवेग",
+ "positionTemp": "तापक्रम",
+ "positionDeviceTemp": "यन्त्र तापक्रम",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "सञ्चालक",
+ "positionCommand": "आदेश",
+ "positionBlocked": "अवरुद्ध",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD गति",
+ "positionObdOdometer": "OBD ओडोमिटर",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "चालक अद्वितीय आईडी",
+ "positionCard": "Card",
+ "positionImage": "छवि",
+ "positionVideo": "भिडियो",
+ "positionAudio": "ध्वनि",
+ "serverTitle": "सर्भर सेटिंग",
+ "serverZoom": "ठुलो बनाउने ",
+ "serverRegistration": "दर्ता ",
+ "serverReadonly": "पढ्ने मात्रै ",
+ "serverForceSettings": "बल सेटिङहरू",
+ "serverAnnouncement": "घोषणा",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "नक्शा ",
+ "mapActive": "सक्रिय नक्शा",
+ "mapOverlay": "नक्सा ओभरले",
+ "mapOverlayCustom": "अनुकूलन ओभरले",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API कुञ्जी",
+ "mapOpenWeatherClouds": "OpenWeather बादलहरू",
+ "mapOpenWeatherPrecipitation": "OpenWeather वर्षा",
+ "mapOpenWeatherPressure": "OpenWeather दबाब",
+ "mapOpenWeatherWind": "OpenWeather पवन",
+ "mapOpenWeatherTemperature": "OpenWeather तापमान",
+ "mapLayer": "नक्शा को तह ",
+ "mapCustom": "अनुकूलन (XYZ)",
+ "mapCustomArcgis": "अनुकूलन (ArcGIS)",
+ "mapCustomLabel": "अनुकूल नक्शा",
+ "mapCarto": "कार्टो आधारनक्सा",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "बिंग नक्शाको चाबी (कि) ",
+ "mapBingRoad": "बिंग नक्शा (सडक)",
+ "mapBingAerial": "बिंग नक्शा (एरियल)",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "बाईडु",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "यान्डेक्स नक्सा",
+ "mapYandexSat": "यान्डेक्स भू-उपग्रह",
+ "mapWikimedia": "विकिमिडिया",
+ "mapOrdnanceSurvey": "आयुध सर्वेक्षण",
+ "mapMapboxStreets": "म्यापबक्स सडकहरू",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "आउटडोर आउटडोर",
+ "mapMapboxSatellite": "म्यापबक्स उपग्रह",
+ "mapMapboxKey": "म्यापबक्स पहुँच टोकन",
+ "mapMapTilerBasic": "MapTiler आधारभूत",
+ "mapMapTilerHybrid": "MapTiler हाइब्रिड",
+ "mapMapTilerKey": "MapTiler API कुञ्जी",
+ "mapLocationIqStreets": "स्थानIQ सडकहरू",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ पहुँच टोकन",
+ "mapTomTomBasic": "टमटम बेसिक",
+ "mapTomTomFlow": "TomTom यातायात प्रवाह",
+ "mapTomTomIncidents": "टमटम ट्राफिक घटनाहरू",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "यहाँ ट्राफिक प्रवाह",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "बहुभुज",
+ "mapShapeCircle": "वृत्त",
+ "mapShapePolyline": "बहुरेखा",
+ "mapLiveRoutes": "प्रत्यक्ष मार्गहरू",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "वर्तमान स्थान",
+ "mapPoiLayer": "POI तह",
+ "mapClustering": "मार्कर क्लस्टरिङ",
+ "mapOnSelect": "चयनमा नक्सा देखाउनुहोस्",
+ "mapDefault": "Default Map",
+ "stateTitle": "अवस्था ",
+ "stateName": "बिषेशता",
+ "stateValue": "मूल्य ",
+ "commandTitle": "आदेश ",
+ "commandSend": "पठाउने ",
+ "commandSent": "आदेश पठाइयो",
+ "commandQueued": "कमाण्ड पङ्क्तिबद्ध",
+ "commandUnit": "इकाई ",
+ "commandCustom": "अनुकुल आदेश",
+ "commandDeviceIdentification": "यन्त्र पहिचान",
+ "commandPositionSingle": "एकल प्रतिबेदन",
+ "commandPositionPeriodic": "आवधिक प्रतिबेदन ",
+ "commandPositionStop": "प्रतिबेदन बन्द गर्ने ",
+ "commandEngineStop": "इन्जिन बन्द गर्ने ",
+ "commandEngineResume": "इन्जिन खोल्ने ",
+ "commandAlarmArm": "हात चेतावनी",
+ "commandAlarmDisarm": "निशस्त्र अलार्म",
+ "commandAlarmDismiss": "अलार्म खारेज गर्नुहोस्",
+ "commandSetTimezone": "समय क्षेत्र सेट गर्नुहोस्",
+ "commandRequestPhoto": "फोटो अनुरोध",
+ "commandPowerOff": "पावर अफ यन्त्र",
+ "commandRebootDevice": " यन्त्र रिबुट गर्नुहोस्",
+ "commandFactoryReset": "Factory रिसेट",
+ "commandSendSms": "एसएमएस पठाउनुहोस्",
+ "commandSendUssd": "USSD पठाउनुहोस्",
+ "commandSosNumber": "SOS नम्बर सेट गर्नुहोस्",
+ "commandSilenceTime": "मौन समय सेट गर्नुहोस्",
+ "commandSetPhonebook": "फोनबुक सेट गर्नुहोस्",
+ "commandVoiceMessage": "आवाज सन्देश",
+ "commandOutputControl": "आउटपुट नियन्त्रण",
+ "commandVoiceMonitoring": "आवाज निगरानी",
+ "commandSetAgps": "जिपियस् सेट गर्नुहोस्",
+ "commandSetIndicator": "सूचक सेट गर्नुहोस्",
+ "commandConfiguration": "कन्फिगरेसन",
+ "commandGetVersion": "संस्करण प्राप्त गर्नुहोस्",
+ "commandFirmwareUpdate": "फर्मवेयर अपडेट गर्नुहोस्",
+ "commandSetConnection": "जडान सेट गर्नुहोस्",
+ "commandSetOdometer": "ओडोमिटर सेट गर्नुहोस्",
+ "commandGetModemStatus": "मोदेमको स्थिति जान्नुहोस्",
+ "commandGetDeviceStatus": "यन्त्रको स्थिति जान्नुहोस्",
+ "commandSetSpeedLimit": "गति सीमा सेट गर्नुहोस्",
+ "commandModePowerSaving": "पावर बचत मोड",
+ "commandModeDeepSleep": "गहिरो निद्रा मोड",
+ "commandAlarmGeofence": "Geofence अलार्म सेट गर्नुहोस्",
+ "commandAlarmBattery": "ब्याट्री अलार्म सेट गर्नुहोस्",
+ "commandAlarmSos": "SOS अलार्म सेट गर्नुहोस्",
+ "commandAlarmRemove": "अलार्म हटाउनुहोस् सेट गर्नुहोस्",
+ "commandAlarmClock": "घडी अलार्म सेट गर्नुहोस्",
+ "commandAlarmSpeed": "गति अलार्म सेट गर्नुहोस्",
+ "commandAlarmFall": "पतन अलार्म सेट गर्नुहोस्",
+ "commandAlarmVibration": "कम्पन अलार्म सेट गर्नुहोस्",
+ "commandFrequency": "आव्रती ",
+ "commandTimezone": "समय क्षेत्र अफसेट",
+ "commandMessage": "सन्देश",
+ "commandRadius": "त्रिज्या",
+ "commandEnable": "सक्षम गर्नुहोस्",
+ "commandData": "डाटा",
+ "commandIndex": "अनुक्रमणिका",
+ "commandPhone": "फोन नम्बर",
+ "commandServer": "सर्भर",
+ "commandPort": "पोर्ट",
+ "eventAll": "सबै घटना",
+ "eventDeviceOnline": "अनलाईन स्थिति",
+ "eventDeviceUnknown": "अज्ञात स्थिति",
+ "eventDeviceOffline": "अफलाईन स्थिति",
+ "eventDeviceInactive": "यन्त्र निष्क्रिय छ",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "यन्त्र चलिरहेको छ",
+ "eventDeviceStopped": "यन्त्र रोकियो",
+ "eventDeviceOverspeed": "गति सिमा नाघ्यो",
+ "eventDeviceFuelDrop": "इन्धन खस्यो",
+ "eventDeviceFuelIncrease": "इन्धन बढ्यो",
+ "eventCommandResult": "आदेश परिणाम",
+ "eventGeofenceEnter": "Geofence प्रवेश गर्नुभयो",
+ "eventGeofenceExit": "Geofence बाहिर निस्कियो",
+ "eventAlarm": "अलार्म",
+ "eventIgnitionOn": "इग्निशन अन",
+ "eventIgnitionOff": "इग्निशन बन्द",
+ "eventMaintenance": "मर्मत आवश्यक",
+ "eventTextMessage": "पाठ सन्देश प्राप्त भयो",
+ "eventDriverChanged": "चालक परिवर्तन भयो",
+ "eventMedia": "मिडिया",
+ "eventsScrollToLast": "अन्तिममा स्क्रोल गर्नुहोस्",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "सामान्य",
+ "alarmSos": "SOS",
+ "alarmVibration": "कम्पन",
+ "alarmMovement": "आन्दोलन",
+ "alarmLowspeed": "कम गति",
+ "alarmOverspeed": "अधिक गति",
+ "alarmFallDown": "तल झर्नु",
+ "alarmLowPower": "कम शक्ति",
+ "alarmLowBattery": "कम ब्याट्री",
+ "alarmFault": "गल्ती",
+ "alarmPowerOff": "पावर अफ",
+ "alarmPowerOn": "चालु गर",
+ "alarmDoor": "ढोका",
+ "alarmLock": "ताला",
+ "alarmUnlock": "अनलक गर्नुहोस्",
+ "alarmGeofence": "जियोफेन्स",
+ "alarmGeofenceEnter": "Geofence प्रविष्ट गर्नुहोस्",
+ "alarmGeofenceExit": "Geofence निकास",
+ "alarmGpsAntennaCut": "काटिएको जिपियस् आन्टेना",
+ "alarmAccident": "दुर्घटना",
+ "alarmTow": "टो",
+ "alarmIdle": "निष्क्रिय",
+ "alarmHighRpm": "उच्च RPM",
+ "alarmHardAcceleration": "हार्ड एक्सेलेरेशन",
+ "alarmHardBraking": "कडा ब्रेकिङ",
+ "alarmHardCornering": "कडा कुना",
+ "alarmLaneChange": "लेन परिवर्तन",
+ "alarmFatigueDriving": "थकान ड्राइभिङ",
+ "alarmPowerCut": "पावर कट",
+ "alarmPowerRestored": "शक्ति पुनर्स्थापित",
+ "alarmJamming": "जामिङ",
+ "alarmTemperature": "तापक्रम",
+ "alarmParking": "पार्किङ",
+ "alarmBonnet": "बोनेट",
+ "alarmFootBrake": "फुट ब्रेक",
+ "alarmFuelLeak": "इन्धन चुहावट",
+ "alarmTampering": "छेडछाड",
+ "alarmRemoving": "हटाउँदै",
+ "notificationType": "सुचना प्रकार",
+ "notificationAlways": "सबै उपकरणहरू",
+ "notificationNotificators": "च्यानलहरू",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "वेब",
+ "notificatorMail": "पत्र",
+ "notificatorSms": "यसएमयस",
+ "notificatorFirebase": "फायरबेस",
+ "notificatorTraccar": "ट्रयाकर",
+ "notificatorTelegram": "टेलिग्राम",
+ "notificatorPushover": "पुशओभर",
+ "reportReplay": "रिप्ले",
+ "reportCombined": "Combined",
+ "reportRoute": "रुट",
+ "reportEvents": "घटनाहरू",
+ "reportTrips": "यात्राहरू",
+ "reportStops": "रोकिन्छ",
+ "reportSummary": "सारांश",
+ "reportDaily": "दैनिक सारांश",
+ "reportChart": "मानचित्र",
+ "reportConfigure": "कन्फिगर ",
+ "reportEventTypes": "घटना प्रकार",
+ "reportChartType": "मानचित्र प्रकार",
+ "reportShowMarkers": "मार्करहरू देखाउनुहोस्",
+ "reportExport": "निकास",
+ "reportEmail": "प्रतिबेदन ई-मेल गर्ने",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "अवधि",
+ "reportCustom": "अनुकुल",
+ "reportToday": "आज",
+ "reportYesterday": "हिजो",
+ "reportThisWeek": "हालको हप्ता",
+ "reportPreviousWeek": "अघिल्लो हप्ता",
+ "reportThisMonth": "हालको महिना",
+ "reportPreviousMonth": "अघिल्लो महिना",
+ "reportDeviceName": "यन्त्र नाम",
+ "reportAverageSpeed": "औसत गति",
+ "reportMaximumSpeed": "अधिकतम गति",
+ "reportEngineHours": "इन्जिन घण्टा",
+ "reportDuration": "अवधि",
+ "reportStartDate": "सुरू मिति",
+ "reportStartTime": "शुरु समय",
+ "reportStartAddress": "शुरु ठेगाना",
+ "reportEndTime": "अन्त्य समय",
+ "reportEndAddress": "अन्त्य ठेगाना",
+ "reportSpentFuel": "खर्चित ईन्धन",
+ "reportStartOdometer": "ओडोमिटर सुरु",
+ "reportEndOdometer": "ओडोमिटर अन्त्य",
+ "statisticsTitle": "तथ्याङ्क ",
+ "statisticsCaptureTime": "समय कब्जा",
+ "statisticsActiveUsers": "सक्रिय प्रयोगकर्ता",
+ "statisticsActiveDevices": "सक्रिय यन्त्रहरू",
+ "statisticsRequests": "अनुरोधहरू",
+ "statisticsMessagesReceived": "सन्देशहरू प्राप्त भयो",
+ "statisticsMessagesStored": "सन्देशहरू भण्डारण गरियो",
+ "statisticsGeocoder": "जियोकोडर अनुरोधहरू",
+ "statisticsGeolocation": "भौगोलिक स्थान अनुरोधहरू",
+ "categoryArrow": "तीर",
+ "categoryDefault": "पुर्वनिर्धारित",
+ "categoryAnimal": "जनावर ",
+ "categoryBicycle": "साइकल ",
+ "categoryBoat": "डुंगा ",
+ "categoryBus": "बस ",
+ "categoryCar": "कार ",
+ "categoryCamper": "Camper",
+ "categoryCrane": "क्रेन ",
+ "categoryHelicopter": "हेलिकप्टर ",
+ "categoryMotorcycle": "मोटरसाइकल ",
+ "categoryOffroad": "कच्ची बाटो ",
+ "categoryPerson": "व्यक्ति ",
+ "categoryPickup": "पिकअप ",
+ "categoryPlane": "हवाइजहाज ",
+ "categoryShip": "जहाज ",
+ "categoryTractor": "ट्रयाक्टर",
+ "categoryTrain": "रेल",
+ "categoryTram": "ट्राम",
+ "categoryTrolleybus": "ट्रलिबस",
+ "categoryTruck": "ट्रक ",
+ "categoryVan": "भ्यान ",
+ "categoryScooter": "स्कुटर",
+ "maintenanceStart": "शुरु",
+ "maintenancePeriod": "अवधि"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/nl.json b/legacy/web/l10n/nl.json
new file mode 100644
index 00000000..224adc26
--- /dev/null
+++ b/legacy/web/l10n/nl.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Laden...",
+ "sharedHide": "Verberg",
+ "sharedSave": "Opslaan",
+ "sharedUpload": "Upload",
+ "sharedSet": "Instellen",
+ "sharedCancel": "Annuleren",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Toevoegen",
+ "sharedEdit": "Bewerken",
+ "sharedRemove": "Verwijderen",
+ "sharedRemoveConfirm": "Item verwijderen?",
+ "sharedNoData": "Geen gegevens",
+ "sharedSubject": "Subject",
+ "sharedYes": "Ja",
+ "sharedNo": "Nee",
+ "sharedKm": "km",
+ "sharedMi": "mijl",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "knopen",
+ "sharedKmh": "km/h",
+ "sharedMph": "mijl per uur",
+ "sharedHour": "Uur",
+ "sharedMinute": "Minuut",
+ "sharedSecond": "Seconde",
+ "sharedDays": "dagen",
+ "sharedHours": "uren",
+ "sharedMinutes": "minuten",
+ "sharedDecimalDegrees": "Decimale graden",
+ "sharedDegreesDecimalMinutes": "Graden decimale minuten",
+ "sharedDegreesMinutesSeconds": "Graden minuten/seconden",
+ "sharedName": "Naam",
+ "sharedDescription": "Omschrijving",
+ "sharedSearch": "Zoeken",
+ "sharedIconScale": "Schaal van iconen",
+ "sharedGeofence": "Geografisch gebied",
+ "sharedGeofences": "Geografische gebieden",
+ "sharedCreateGeofence": "Maak geofence",
+ "sharedNotifications": "Notificatie",
+ "sharedNotification": "Notificatie",
+ "sharedAttributes": "Attributen",
+ "sharedAttribute": "Attribuut",
+ "sharedDrivers": "Bestuurders",
+ "sharedDriver": "Bestuurder",
+ "sharedArea": "Gebied",
+ "sharedSound": "Notificatiegeluid",
+ "sharedType": "Type",
+ "sharedDistance": "Afstand",
+ "sharedHourAbbreviation": "u",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "liter",
+ "sharedImpGallon": "imperial gallon",
+ "sharedUsGallon": "U.S. gallon",
+ "sharedLiterPerHourAbbreviation": "l/u",
+ "sharedGetMapState": "Haal kaartstatus op",
+ "sharedComputedAttribute": "Berekend attribuut",
+ "sharedComputedAttributes": "Berekende attributen",
+ "sharedCheckComputedAttribute": "Controleer berekend attribuut",
+ "sharedExpression": "Uitdrukking",
+ "sharedDevice": "Apparaat",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Stuur testnotificatie",
+ "sharedTestNotificators": "Testkanalen",
+ "sharedTestExpression": "Testexpressie",
+ "sharedCalendar": "Kalender",
+ "sharedCalendars": "Kalenders",
+ "sharedFile": "Bestand",
+ "sharedSearchDevices": "Zoek apparaten",
+ "sharedSortBy": "Sorteer op",
+ "sharedFilterMap": "Filter op kaart",
+ "sharedSelectFile": "Selecteer bestand",
+ "sharedPhone": "Telefoon",
+ "sharedRequired": "Verplicht",
+ "sharedPreferences": "Voorkeuren",
+ "sharedPermissions": "Rechten",
+ "sharedConnections": "Connecties",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primair",
+ "sharedSecondary": "Secundair",
+ "sharedTypeString": "Tekst",
+ "sharedTypeNumber": "Getal",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Tijdzone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Opgeslagen commando",
+ "sharedSavedCommands": "Opgeslagen commando's",
+ "sharedNew": "Nieuw...",
+ "sharedShowAddress": "Toon adres",
+ "sharedShowDetails": "Meer details",
+ "sharedDisabled": "Uitgeschakeld",
+ "sharedMaintenance": "Onderhoud",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarmen",
+ "sharedLocation": "Locatie",
+ "sharedImport": "Importeren",
+ "sharedColumns": "Kolommen",
+ "sharedDropzoneText": "Sleep en plaats hier een bestand of klik hier",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Eenvoudig",
+ "calendarRecurrence": "Herhaling",
+ "calendarOnce": "Eenmalig",
+ "calendarDaily": "Dagelijks",
+ "calendarWeekly": "Wekelijks",
+ "calendarMonthly": "Maandelijks",
+ "calendarDays": "Dagen",
+ "calendarSunday": "Zondag",
+ "calendarMonday": "Maandag",
+ "calendarTuesday": "Dinsdag",
+ "calendarWednesday": "Woensdag",
+ "calendarThursday": "Donderdag",
+ "calendarFriday": "Vrijdag",
+ "calendarSaturday": "Zaterdag",
+ "attributeShowGeofences": "Toon geofences",
+ "attributeSpeedLimit": "Snelheidslimiet",
+ "attributeFuelDropThreshold": "Brandstofafname grens",
+ "attributeFuelIncreaseThreshold": "Brandstoftoename grens",
+ "attributePolylineDistance": "Polylijn afstand",
+ "attributeReportIgnoreOdometer": "Rapport: negeer odometer",
+ "attributeWebReportColor": "Web: rapportkleur",
+ "attributeDevicePassword": "Apparaatwachtwoord",
+ "attributeDeviceImage": "Apparaatafbeelding",
+ "attributeDeviceInactivityStart": "Start van inactiviteit",
+ "attributeDeviceInactivityPeriod": "Inactiviteitperiode",
+ "attributeProcessingCopyAttributes": "Verwerking: kopieer attributen",
+ "attributeColor": "Kleur",
+ "attributeWebLiveRouteLength": "Web: live routelengte",
+ "attributeWebSelectZoom": "Web: zoomen tijdens selecteren",
+ "attributeWebMaxZoom": "Web: maximaal zoomniveau",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover gebruikerssleutel",
+ "attributePushoverDeviceNames": "Pushover apparaatnamen",
+ "attributeMailSmtpHost": "Mail: SMTP host",
+ "attributeMailSmtpPort": "Mail: SMTP poort",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTL ingeschakeld",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTL vereist",
+ "attributeMailSmtpSslEnable": "Mail: SMTP SSL ingeschakeld",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL vertrouwd",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL protocollen",
+ "attributeMailSmtpFrom": "Mail: SMTP van",
+ "attributeMailSmtpAuth": "Mail: SMTP authenticatie ingeschakeld",
+ "attributeMailSmtpUsername": "Mail: SMTP gebruikersnaam",
+ "attributeMailSmtpPassword": "Mail: SMTP wachtwoord",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: attributen uitschakelen",
+ "attributeUiDisableGroups": "UI: groepen uitschakelen",
+ "attributeUiDisableEvents": "UI: Gebeurtenissen uitschakelen",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: bestuurders uitschakelen",
+ "attributeUiDisableComputedAttributes": "UI: berekende attributen uitschakelen",
+ "attributeUiDisableCalendars": "UI: kalenders uitschakelen",
+ "attributeUiDisableMaintenance": "UI: Onderhoud uitschakelen",
+ "attributeUiHidePositionAttributes": "UI: Verberg positie-eigenschappen",
+ "attributeUiDisableLoginLanguage": "UI: logintaal uitschakelen",
+ "attributeNotificationTokens": "Notificatietokens",
+ "attributePopupInfo": "Popup info",
+ "errorTitle": "Fout",
+ "errorGeneral": "Ongeldige parameters of overschrijding van beperkingen",
+ "errorConnection": "Verbindingsfout",
+ "errorSocket": "Web socket verbindingsfout",
+ "errorZero": "Mag niet nul zijn",
+ "userEmail": "E-mail",
+ "userPassword": "Wachtwoord",
+ "userAdmin": "Administrator",
+ "userRemember": "Onthouden",
+ "userExpirationTime": "Verloopdatum",
+ "userDeviceLimit": "Apparaatlimiet",
+ "userUserLimit": "Gebruikerlimiet",
+ "userDeviceReadonly": "Apparaat alleen-lezen",
+ "userLimitCommands": "Limiteer commando's",
+ "userDisableReports": "Rapporten uitschakelen",
+ "userFixedEmail": "Geen e-mail aanpassing",
+ "userToken": "Token",
+ "userDeleteAccount": "Geen account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Inloggen",
+ "loginLanguage": "Taal",
+ "loginReset": "Wachtwoord herstellen",
+ "loginRegister": "Registreren",
+ "loginLogin": "Inloggen",
+ "loginOpenId": "Inloggen met OpenID",
+ "loginFailed": "Onjuist e-mailadres of wachtwoord",
+ "loginCreated": "De nieuwe gebruiker is geregistreerd",
+ "loginResetSuccess": "Check je e-mail",
+ "loginUpdateSuccess": "Het wachtwoord is ingesteld",
+ "loginLogout": "Afmelden",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Apparaten en status",
+ "deviceSelected": "Geselecteerd apparaat",
+ "deviceTitle": "Apparaten",
+ "devicePrimaryInfo": "Apparaattitel",
+ "deviceSecondaryInfo": "Apparaatdetail",
+ "deviceIdentifier": "Identifier",
+ "deviceModel": "Model",
+ "deviceContact": "Contact",
+ "deviceCategory": "Categorie",
+ "deviceLastUpdate": "Laatste update",
+ "deviceCommand": "Commando",
+ "deviceFollow": "Volgen",
+ "deviceTotalDistance": "Totale afstand",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Onbekend",
+ "deviceRegisterFirst": "Registreer je eerste apparaat",
+ "deviceIdentifierHelp": "IMEI, serienummer of ander id. Het moet overeenkomen met het identificatienummer dat het apparaat rapporteert aan de server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Groep",
+ "groupParent": "Groep",
+ "groupNoGroup": "Geen groep",
+ "settingsTitle": "Instellingen",
+ "settingsUser": "Account",
+ "settingsGroups": "Groepen",
+ "settingsServer": "Server",
+ "settingsUsers": "Gebruikers",
+ "settingsDistanceUnit": "Afstandseenheid",
+ "settingsAltitudeUnit": "Hoogte eenheid",
+ "settingsSpeedUnit": "Snelheidseenheid",
+ "settingsVolumeUnit": "Volume-eenheid",
+ "settingsTwelveHourFormat": "12-uurs indeling",
+ "settingsCoordinateFormat": "Coördinatenformaat ",
+ "settingsServerVersion": "Serverversie",
+ "settingsAppVersion": "Appversie",
+ "settingsConnection": "Verbinding",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Rapportages",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Apparaat",
+ "reportGroup": "Groep",
+ "reportFrom": "Van",
+ "reportTo": "Naar",
+ "reportShow": "Laat zien",
+ "reportClear": "Leegmaken",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Tijd aanpassen",
+ "positionDeviceTime": "Tijd van apparaat",
+ "positionServerTime": "Tijd van server",
+ "positionValid": "Geldig",
+ "positionAccuracy": "Nauwkeurigheid",
+ "positionLatitude": "Breedtegraad",
+ "positionLongitude": "Lengtegraad",
+ "positionAltitude": "Hoogte",
+ "positionSpeed": "Snelheid",
+ "positionCourse": "Koers",
+ "positionAddress": "Adres",
+ "positionProtocol": "Protocol",
+ "positionDistance": "Afstand",
+ "positionRpm": "RPM",
+ "positionFuel": "Brandstof",
+ "positionPower": "Stroom",
+ "positionBattery": "Accu",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellieten",
+ "positionSatVisible": "Zichtbare satellieten",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roamen",
+ "positionEvent": "Gebeurtenis",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service odometer",
+ "positionTripOdometer": "Reis odometer",
+ "positionHours": "Uur",
+ "positionSteps": "Stappen",
+ "positionInput": "Invoer",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Uitvoer",
+ "positionBatteryLevel": "Accuniveau",
+ "positionFuelConsumption": "Brandstofverbruik",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware versie",
+ "positionVersionHw": "Hardware versie",
+ "positionIgnition": "Contact",
+ "positionFlags": "Vlaggen",
+ "positionCharge": "Lading",
+ "positionIp": "IP",
+ "positionArchive": "Archief",
+ "positionVin": "VIN",
+ "positionApproximate": "Benadering",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Beweging",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Versnelling",
+ "positionTemp": "Temperatuur",
+ "positionDeviceTemp": "Apparaattemperatuur",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Commando",
+ "positionBlocked": "Geblokkeerd",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD snelheid",
+ "positionObdOdometer": "OBD odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Bestuurder uniek ID",
+ "positionCard": "Card",
+ "positionImage": "Afbeelding",
+ "positionVideo": "Video",
+ "positionAudio": "Geluid",
+ "serverTitle": "Serverinstellingen",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registratie",
+ "serverReadonly": "Alleen lezen",
+ "serverForceSettings": "Instellingen forceren",
+ "serverAnnouncement": "Aankondiging",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Kaart",
+ "mapActive": "Actieve kaarten",
+ "mapOverlay": "Kaartlaag",
+ "mapOverlayCustom": "Aangepaste laag",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API sleutel",
+ "mapOpenWeatherClouds": "OpenWeather wolken",
+ "mapOpenWeatherPrecipitation": "OpenWeather neerslag",
+ "mapOpenWeatherPressure": "OpenWeather luchtdruk",
+ "mapOpenWeatherWind": "OpenWeather wind",
+ "mapOpenWeatherTemperature": "OpenWeather temperatuur",
+ "mapLayer": "Kaart laag",
+ "mapCustom": "Aangepast (XYZ)",
+ "mapCustomArcgis": "Aangepast (ArcGIS)",
+ "mapCustomLabel": "Aangepaste map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps sleutel",
+ "mapBingRoad": "Bing Maps Wegen",
+ "mapBingAerial": "Bing Maps Luchtfoto",
+ "mapBingHybrid": "Bing Maps hybride",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex kaart",
+ "mapYandexSat": "Yandex satelliet",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "MapBox toegangsleutel",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API sleutel",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ toegangsleutel",
+ "mapTomTomBasic": "TomTom basis",
+ "mapTomTomFlow": "TomTom verkeersstromen",
+ "mapTomTomIncidents": "TomTom verkeersincidenten",
+ "mapTomTomKey": "TomTom API sleutel",
+ "mapHereBasic": "Here basis",
+ "mapHereHybrid": "Here hybride",
+ "mapHereSatellite": "Here satelliet",
+ "mapHereFlow": "Here verkeersstromen",
+ "mapHereKey": "Here API sleutel",
+ "mapShapePolygon": "Polygoon",
+ "mapShapeCircle": "Cirkel",
+ "mapShapePolyline": "Polylijn",
+ "mapLiveRoutes": "Live routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Huidige locatie",
+ "mapPoiLayer": "POI laag",
+ "mapClustering": "Markeringen clusteren",
+ "mapOnSelect": "Toon kaart bij selectie",
+ "mapDefault": "Default Map",
+ "stateTitle": "Status",
+ "stateName": "Parameter",
+ "stateValue": "Waarde",
+ "commandTitle": "Commando",
+ "commandSend": "Verstuur",
+ "commandSent": "Commando verstuurd",
+ "commandQueued": "Commando in de wachtrij geplaatst",
+ "commandUnit": "Eenheid",
+ "commandCustom": "Aangepast commando",
+ "commandDeviceIdentification": "Apparaatidentificatie",
+ "commandPositionSingle": "Enkel commando",
+ "commandPositionPeriodic": "Periodiek rapporteren",
+ "commandPositionStop": "Stop rapporteren",
+ "commandEngineStop": "Motor stoppen",
+ "commandEngineResume": "Motor hervatten",
+ "commandAlarmArm": "Alarm aan",
+ "commandAlarmDisarm": "Alarm uit",
+ "commandAlarmDismiss": "Alarm negeren",
+ "commandSetTimezone": "Tijdzone instellen",
+ "commandRequestPhoto": "Vraag foto",
+ "commandPowerOff": "Apparaat uitschakelen",
+ "commandRebootDevice": "Herstart apparaat",
+ "commandFactoryReset": "Naar fabrieksinstellingen",
+ "commandSendSms": "Stuur SMS",
+ "commandSendUssd": "Stuur USDD",
+ "commandSosNumber": "Stel SOS-nummer in",
+ "commandSilenceTime": "Stel 'Stille tijd' in",
+ "commandSetPhonebook": "Bewerk telefoonboek",
+ "commandVoiceMessage": "Spraakbericht",
+ "commandOutputControl": "Stel output in",
+ "commandVoiceMonitoring": "Stemmonitoring",
+ "commandSetAgps": "AGPS instellen",
+ "commandSetIndicator": "Indicator instellen",
+ "commandConfiguration": "Configuratie",
+ "commandGetVersion": "Versie ophalen",
+ "commandFirmwareUpdate": "Firmware bijwerken",
+ "commandSetConnection": "Connectie instellen",
+ "commandSetOdometer": "Odometer instellen",
+ "commandGetModemStatus": "Modemstatus opvragen",
+ "commandGetDeviceStatus": "Apparaatstatus opvragen",
+ "commandSetSpeedLimit": "Snelheidslimiet instellen",
+ "commandModePowerSaving": "Batterijspaarstand",
+ "commandModeDeepSleep": "Diepe slaapstand",
+ "commandAlarmGeofence": "Geofence-alarm instellen",
+ "commandAlarmBattery": "Accualarm instellen",
+ "commandAlarmSos": "SOS-alarm instellen",
+ "commandAlarmRemove": "Verwijderalarm instellen",
+ "commandAlarmClock": "Klokalarm instellen",
+ "commandAlarmSpeed": "Snelheidsalarm instellen",
+ "commandAlarmFall": "Probleemalarm instellen",
+ "commandAlarmVibration": "Trilalarm instellen",
+ "commandFrequency": "Frequentie",
+ "commandTimezone": "Tijdzoneverschil",
+ "commandMessage": "Bericht",
+ "commandRadius": "Radius",
+ "commandEnable": "Inschakelen",
+ "commandData": "Data",
+ "commandIndex": "Index",
+ "commandPhone": "Telefoonnummer",
+ "commandServer": "Server",
+ "commandPort": "Poort",
+ "eventAll": "Alle gebeurtenissen",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status onbekend",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Einde van inactiviteit",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Apparaat beweegt",
+ "eventDeviceStopped": "Apparaat gestopt",
+ "eventDeviceOverspeed": "Snelheidslimiet overschreden",
+ "eventDeviceFuelDrop": "Brandstofafname",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Commando resultaat",
+ "eventGeofenceEnter": "Geofence binnengegaan",
+ "eventGeofenceExit": "Geofence verlaten",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ontsteking aan",
+ "eventIgnitionOff": "Ontsteking uit",
+ "eventMaintenance": "Onderhoud vereist",
+ "eventTextMessage": "Tekstbericht ontvangen",
+ "eventDriverChanged": "Bestuurder veranderd",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll naar laatste",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Algemeen",
+ "alarmSos": "SOS",
+ "alarmVibration": "Trilling",
+ "alarmMovement": "Beweging",
+ "alarmLowspeed": "Lage snelheid",
+ "alarmOverspeed": "Snelheidsoverschreiding",
+ "alarmFallDown": "Gevallen",
+ "alarmLowPower": "Lage stroom",
+ "alarmLowBattery": "Laag accuniveau",
+ "alarmFault": "Fout",
+ "alarmPowerOff": "Uitgeschakeld",
+ "alarmPowerOn": "Ingeschakeld",
+ "alarmDoor": "Deur",
+ "alarmLock": "Afgesloten",
+ "alarmUnlock": "Geopend",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence binnengegaan",
+ "alarmGeofenceExit": "Geofence verlaten",
+ "alarmGpsAntennaCut": "GPS antenne verbroken",
+ "alarmAccident": "Ongeluk",
+ "alarmTow": "Gesleept",
+ "alarmIdle": "Rust",
+ "alarmHighRpm": "Hoge TPM",
+ "alarmHardAcceleration": "Harde versnelling",
+ "alarmHardBraking": "Harde remming",
+ "alarmHardCornering": "Scherpe bocht",
+ "alarmLaneChange": "Rijbaanwisseling",
+ "alarmFatigueDriving": "Vermoeid rijden",
+ "alarmPowerCut": "Stroomonderbreking",
+ "alarmPowerRestored": "Stroom hersteld",
+ "alarmJamming": "Verstoring",
+ "alarmTemperature": "Temperatuur",
+ "alarmParking": "Parkeren",
+ "alarmBonnet": "Motorkap",
+ "alarmFootBrake": "Voetrem",
+ "alarmFuelLeak": "Brandstoflek",
+ "alarmTampering": "Knoeien",
+ "alarmRemoving": "Verwijderd",
+ "notificationType": "Notificatietype",
+ "notificationAlways": "Alle apparaten",
+ "notificationNotificators": "Kanalen",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "E-mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Opnieuw afspelen",
+ "reportCombined": "Combined",
+ "reportRoute": "Route",
+ "reportEvents": "Gebeurtenissen",
+ "reportTrips": "Ritten",
+ "reportStops": "Stops",
+ "reportSummary": "Samenvatting",
+ "reportDaily": "Dagelijkse samenvatting",
+ "reportChart": "Grafiek",
+ "reportConfigure": "Configureer",
+ "reportEventTypes": "Gebeurtenistypen",
+ "reportChartType": "Grafiektype",
+ "reportShowMarkers": "Toon markeringen",
+ "reportExport": "Exporteren",
+ "reportEmail": "E-mailrapport",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Periode",
+ "reportCustom": "Aangepast",
+ "reportToday": "Vandaag",
+ "reportYesterday": "Gisteren",
+ "reportThisWeek": "Deze week",
+ "reportPreviousWeek": "Vorige week",
+ "reportThisMonth": "Deze maand",
+ "reportPreviousMonth": "Vorige maand",
+ "reportDeviceName": "Apparaatnaam",
+ "reportAverageSpeed": "Gemiddelde snelheid",
+ "reportMaximumSpeed": "Maximale snelheid",
+ "reportEngineHours": "Draaiuren motor",
+ "reportDuration": "Duur",
+ "reportStartDate": "Startdatum",
+ "reportStartTime": "Starttijd",
+ "reportStartAddress": "Beginadres",
+ "reportEndTime": "Eindtijd",
+ "reportEndAddress": "Eindadres",
+ "reportSpentFuel": "Verbruikte brandstof",
+ "reportStartOdometer": "Odometer start",
+ "reportEndOdometer": "Odometer einde",
+ "statisticsTitle": "Statistieken",
+ "statisticsCaptureTime": "Opnametijd",
+ "statisticsActiveUsers": "Actieve gebruikers",
+ "statisticsActiveDevices": "Actieve apparaten",
+ "statisticsRequests": "Verzoeken",
+ "statisticsMessagesReceived": "Ontvangen berichten",
+ "statisticsMessagesStored": "Opgeslagen berichten",
+ "statisticsGeocoder": "Geocoderverzoeken",
+ "statisticsGeolocation": "Geolocatieverzoeken",
+ "categoryArrow": "Aanwijzer",
+ "categoryDefault": "Standaard",
+ "categoryAnimal": "Dier",
+ "categoryBicycle": "Fiets",
+ "categoryBoat": "Boot",
+ "categoryBus": "Bus",
+ "categoryCar": "Auto",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Kraan",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "Motor",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Persoon",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Vliegtuig",
+ "categoryShip": "Schip",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Trein",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Vrachtwagen",
+ "categoryVan": "Busje",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Periode"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/nn.json b/legacy/web/l10n/nn.json
new file mode 100644
index 00000000..2bdc5a9a
--- /dev/null
+++ b/legacy/web/l10n/nn.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Lastar...",
+ "sharedHide": "Gøym",
+ "sharedSave": "Lagre",
+ "sharedUpload": "Upload",
+ "sharedSet": "Sett",
+ "sharedCancel": "Avbryt",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Legg til",
+ "sharedEdit": "Endre",
+ "sharedRemove": "Fjern",
+ "sharedRemoveConfirm": "Fjern element?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nm",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/t",
+ "sharedMph": "mph",
+ "sharedHour": "Time",
+ "sharedMinute": "Minutt",
+ "sharedSecond": "Sekund",
+ "sharedDays": "dagar",
+ "sharedHours": "timar",
+ "sharedMinutes": "minuttar",
+ "sharedDecimalDegrees": "Disimalgrader",
+ "sharedDegreesDecimalMinutes": "Desimalminutter",
+ "sharedDegreesMinutesSeconds": "Grader minuttar sekund",
+ "sharedName": "Namn",
+ "sharedDescription": "Beskriving",
+ "sharedSearch": "Søk",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geo-gjerde",
+ "sharedGeofences": "Geo-gjerde",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Varsel",
+ "sharedNotification": "Varsel",
+ "sharedAttributes": "Eigenskapar",
+ "sharedAttribute": "Eigenskap",
+ "sharedDrivers": "Sjåførar",
+ "sharedDriver": "Sjåfør",
+ "sharedArea": "Område",
+ "sharedSound": "Varslingslyd",
+ "sharedType": "Type",
+ "sharedDistance": "Avstand",
+ "sharedHourAbbreviation": "t",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Britisk gallon",
+ "sharedUsGallon": "Amerikansk gallon",
+ "sharedLiterPerHourAbbreviation": "l/t",
+ "sharedGetMapState": "Få karttilstand",
+ "sharedComputedAttribute": "Berekna eigenskap",
+ "sharedComputedAttributes": "Berekna eigenskapar",
+ "sharedCheckComputedAttribute": "Sjekk berekna eigenskaper",
+ "sharedExpression": "Uttrykk",
+ "sharedDevice": "Eining",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send testvarsel",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Kalender",
+ "sharedCalendars": "Kalendrar",
+ "sharedFile": "Fil",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Velg fil",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Naudsynt",
+ "sharedPreferences": "Innstillingar",
+ "sharedPermissions": "Løyve",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Ekstra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Streng",
+ "sharedTypeNumber": "Nummer",
+ "sharedTypeBoolean": "Boolsk",
+ "sharedTimezone": "Tidssone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Lagra kommando",
+ "sharedSavedCommands": "Lagra kommandoar",
+ "sharedNew": "Ny...",
+ "sharedShowAddress": "Vis adresse",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Deaktiver",
+ "sharedMaintenance": "Vedlikehald",
+ "sharedDeviceAccumulators": "Akkumulatorar",
+ "sharedAlarms": "Alarmar",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Fartsgrense",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polylinjedistanse",
+ "attributeReportIgnoreOdometer": "Rapporter: Ignorer kilometerteljar",
+ "attributeWebReportColor": "Web: Rapportfarge",
+ "attributeDevicePassword": "Einingspassord",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Prosesser: Kopier eigenskapar",
+ "attributeColor": "Farge",
+ "attributeWebLiveRouteLength": "Web: Live rute lengde",
+ "attributeWebSelectZoom": "Web: Skaler ved val",
+ "attributeWebMaxZoom": "Web: Maksimal forstørring",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "E-post: SMTP-vert",
+ "attributeMailSmtpPort": "E-post: SMTP-port",
+ "attributeMailSmtpStarttlsEnable": "E-post: aktiver SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "E-post: SMTP STARTTLS nøydsynt",
+ "attributeMailSmtpSslEnable": "E-post: aktiver SMTP SSL",
+ "attributeMailSmtpSslTrust": "E-Post: SMTP SSL tillit",
+ "attributeMailSmtpSslProtocols": "E-post: SMTP SSL protokollar",
+ "attributeMailSmtpFrom": "E-post: SMTP Frå",
+ "attributeMailSmtpAuth": "E-post: Aktiver SMTP autentisering",
+ "attributeMailSmtpUsername": "E-post: SMTP brukarnamn",
+ "attributeMailSmtpPassword": "E-post: SMTP passord",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Deaktiver hendingar",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Deaktiver Sjåførar",
+ "attributeUiDisableComputedAttributes": "UI: Deaktiver Berekna eigenskaper",
+ "attributeUiDisableCalendars": "UI: Deaktiver kalendrar",
+ "attributeUiDisableMaintenance": " UI: Deaktiver vedlikehald",
+ "attributeUiHidePositionAttributes": "UI: Gøym posisojonseigenskapar",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Feil",
+ "errorGeneral": "ugyldige parameterar eller avgrensingsbrot",
+ "errorConnection": "Forbindelse feila",
+ "errorSocket": "Web socket tilkoplingsfeil",
+ "errorZero": "Kan ikkje vere null",
+ "userEmail": "E-post",
+ "userPassword": "Passord",
+ "userAdmin": "Admin",
+ "userRemember": "Hugs",
+ "userExpirationTime": "Utløp",
+ "userDeviceLimit": "Einingsgrense",
+ "userUserLimit": "Brukargrense",
+ "userDeviceReadonly": "Eining skrivebeskytta",
+ "userLimitCommands": "Avgrens kommandoar",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Symbol",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Logg inn",
+ "loginLanguage": "Språk",
+ "loginReset": "Reset Password",
+ "loginRegister": "Registrer",
+ "loginLogin": "Logg inn",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Feil e-post eller passord",
+ "loginCreated": "Ny brukar har blitt registrert",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Logg ut",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Einingar og status",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Einingar",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifikator",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategori",
+ "deviceLastUpdate": "Sist oppdatert",
+ "deviceCommand": "Kommando",
+ "deviceFollow": "Følj",
+ "deviceTotalDistance": "Total avstand",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Tilkopla",
+ "deviceStatusOffline": "Fråkopla",
+ "deviceStatusUnknown": "Ukjend",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Gruppe",
+ "groupParent": "Gruppe",
+ "groupNoGroup": "Inga gruppe",
+ "settingsTitle": "Innstillingar",
+ "settingsUser": "Konto",
+ "settingsGroups": "Gruppar",
+ "settingsServer": "Tenar",
+ "settingsUsers": "Brukarar",
+ "settingsDistanceUnit": "Avstanseining",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Hastighetseining",
+ "settingsVolumeUnit": "Volumeining",
+ "settingsTwelveHourFormat": "Tolvtimersformat",
+ "settingsCoordinateFormat": "Koordinatformat",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Rapportar",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Eining",
+ "reportGroup": "Gruppe",
+ "reportFrom": "Frå",
+ "reportTo": "Til",
+ "reportShow": "Syn",
+ "reportClear": "Nullstill",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Gyldig",
+ "positionAccuracy": "Nøyaktigheit",
+ "positionLatitude": "Breddegrad",
+ "positionLongitude": "Lengdegrad",
+ "positionAltitude": "Høgde",
+ "positionSpeed": "Hastigheit",
+ "positionCourse": "Retning",
+ "positionAddress": "Adresse",
+ "positionProtocol": "Protokoll",
+ "positionDistance": "Avstand",
+ "positionRpm": "RPM",
+ "positionFuel": "Drivstoff",
+ "positionPower": "Kraft",
+ "positionBattery": "Batteri",
+ "positionRaw": "Rå",
+ "positionIndex": "Register",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelittar",
+ "positionSatVisible": "Synlege satelittar",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Nettveksling (Roaming)",
+ "positionEvent": "Hending",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Kilometerteljar",
+ "positionServiceOdometer": "Service kilometerteljar",
+ "positionTripOdometer": "Turmålar",
+ "positionHours": "Timar",
+ "positionSteps": "Steg",
+ "positionInput": "Inngang",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Utgang",
+ "positionBatteryLevel": "Batterinivå",
+ "positionFuelConsumption": "Drivstoff-forbruk",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Fastvareversjon",
+ "positionVersionHw": "Maskinvareversjon",
+ "positionIgnition": "Tenning",
+ "positionFlags": "Status indikatorar",
+ "positionCharge": "Lade",
+ "positionIp": "IP",
+ "positionArchive": "Arkiv",
+ "positionVin": "VIN",
+ "positionApproximate": "Tilnærma",
+ "positionThrottle": "Gasspedal",
+ "positionMotion": "Rørsle",
+ "positionArmed": "Armert",
+ "positionAcceleration": "Akselerasjon",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Einingstemperatur",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operatør",
+ "positionCommand": "Kommando",
+ "positionBlocked": "Blokert",
+ "positionDtcs": "Diagnosefeilkoder",
+ "positionObdSpeed": "OBD-hastigheit",
+ "positionObdOdometer": "OBD kilometerteljar",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Sjåførunik ID",
+ "positionCard": "Card",
+ "positionImage": "Bilete",
+ "positionVideo": "Video",
+ "positionAudio": "Lyd",
+ "serverTitle": "Tenarinnstillingar",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registering",
+ "serverReadonly": "Skrivebeskytta",
+ "serverForceSettings": "Tving innstillingar",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Kart",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Kartlag",
+ "mapCustom": "Tilpassa (XYZ)",
+ "mapCustomArcgis": "Tilpassa (ArcGIS)",
+ "mapCustomLabel": "Tilpassa kart",
+ "mapCarto": "Carto basiskart",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps-nøkkel",
+ "mapBingRoad": "Bing Maps-veg",
+ "mapBingAerial": "Bing Maps-flyfoto",
+ "mapBingHybrid": "Bing kart hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex kart",
+ "mapYandexSat": "Yandex satellitt",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Mangekant",
+ "mapShapeCircle": "Sirkel",
+ "mapShapePolyline": "Polylinje",
+ "mapLiveRoutes": "Live ruter",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI-lag",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Status",
+ "stateName": "Eigenskap",
+ "stateValue": "Verdi",
+ "commandTitle": "Kommando",
+ "commandSend": "Send",
+ "commandSent": "Kommando sendt",
+ "commandQueued": " Kommando lagt i kø",
+ "commandUnit": "Eining",
+ "commandCustom": "Eigendefinert kommando",
+ "commandDeviceIdentification": "Einingsidentifikasjon",
+ "commandPositionSingle": "Enkel-rapportering",
+ "commandPositionPeriodic": "Periodisk rapportering",
+ "commandPositionStop": "Stopp rapportering",
+ "commandEngineStop": "Stopp motor",
+ "commandEngineResume": "Fortsett motor",
+ "commandAlarmArm": "Slå alarm på",
+ "commandAlarmDisarm": "Slå alarm av",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Sett opp tidssone",
+ "commandRequestPhoto": "Be om foto",
+ "commandPowerOff": "Skru av eining",
+ "commandRebootDevice": "Omstart eining",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Send SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "Set SMS-nummer",
+ "commandSilenceTime": "Sett stilletid",
+ "commandSetPhonebook": "Sett telefonkatalog",
+ "commandVoiceMessage": "Talemelding",
+ "commandOutputControl": "Utgangkontroll",
+ "commandVoiceMonitoring": "Stemmeovervaking",
+ "commandSetAgps": "Sett AGPS",
+ "commandSetIndicator": "Sett indikator",
+ "commandConfiguration": "Oppsett",
+ "commandGetVersion": "Syn versjon",
+ "commandFirmwareUpdate": "Oppdater fastvare",
+ "commandSetConnection": "Sett tilkopling",
+ "commandSetOdometer": "Set kilometerteljar",
+ "commandGetModemStatus": "Syn Modemstatus",
+ "commandGetDeviceStatus": "Synd einingstatus",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekvens",
+ "commandTimezone": "Tidszoneforskyving",
+ "commandMessage": "Melding",
+ "commandRadius": "Radius",
+ "commandEnable": "Aktiver",
+ "commandData": "Data",
+ "commandIndex": "Register",
+ "commandPhone": "Telefonnummer",
+ "commandServer": "Tenar",
+ "commandPort": "Port",
+ "eventAll": "Alle hendingar",
+ "eventDeviceOnline": "Status tilkopla",
+ "eventDeviceUnknown": "Status ukjend",
+ "eventDeviceOffline": "Status fråkopla",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Eining rører seg",
+ "eventDeviceStopped": "Eining stoppa",
+ "eventDeviceOverspeed": "Fartsgrense overstige",
+ "eventDeviceFuelDrop": "Fall i drivstoff",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Kommandoresultat",
+ "eventGeofenceEnter": "Innkommen Geo-gjerde",
+ "eventGeofenceExit": "Forlate Geo-gjerde",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Tenning på",
+ "eventIgnitionOff": "Tenning av",
+ "eventMaintenance": "Vedlikehald nøydsynt",
+ "eventTextMessage": "Tekstmelding motteken",
+ "eventDriverChanged": "Sjåfør endra",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Syn siste",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Generell",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibrasjon",
+ "alarmMovement": "Rørsle",
+ "alarmLowspeed": "Låg hastigheit",
+ "alarmOverspeed": "Høgt turtal",
+ "alarmFallDown": "Fall",
+ "alarmLowPower": "Lite straum",
+ "alarmLowBattery": "Lågt batterinivå",
+ "alarmFault": "Feil",
+ "alarmPowerOff": "Straum fråkopla",
+ "alarmPowerOn": "Straum tilkopla",
+ "alarmDoor": "Dør",
+ "alarmLock": "Lås",
+ "alarmUnlock": "Lås opp",
+ "alarmGeofence": "Geo-gjerde",
+ "alarmGeofenceEnter": "Innanfor Geo-gjerde",
+ "alarmGeofenceExit": "Utanfor Geo-gjerde",
+ "alarmGpsAntennaCut": "GPS-antenne fjerna",
+ "alarmAccident": "Ulykke",
+ "alarmTow": "Tauing",
+ "alarmIdle": "Tomgang",
+ "alarmHighRpm": "Høgt turtal",
+ "alarmHardAcceleration": "Hard akselerasjon",
+ "alarmHardBraking": "Hard oppbremsing",
+ "alarmHardCornering": "Hard vending",
+ "alarmLaneChange": "Filskifte",
+ "alarmFatigueDriving": "Trøyttleikskøyring",
+ "alarmPowerCut": "Straum fråkopla",
+ "alarmPowerRestored": " Straumtilførsel atterreist",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperatur",
+ "alarmParking": "Parkering",
+ "alarmBonnet": "Motorpanser",
+ "alarmFootBrake": "Bremsepedal",
+ "alarmFuelLeak": "Drivstofflekkasje",
+ "alarmTampering": "Tukling",
+ "alarmRemoving": "Fjerning",
+ "notificationType": "Varseltype",
+ "notificationAlways": "Alle einingar",
+ "notificationNotificators": "Kanalar",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Vev",
+ "notificatorMail": "E-post",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Rute",
+ "reportEvents": "Hendingar",
+ "reportTrips": "Turar",
+ "reportStops": "Stopp",
+ "reportSummary": "Oppsumering",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Graf",
+ "reportConfigure": "Set opp",
+ "reportEventTypes": "Hendingstypar",
+ "reportChartType": "Graf type",
+ "reportShowMarkers": "Syn markørar",
+ "reportExport": "Eksporter",
+ "reportEmail": "E-post-rapport",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Periode",
+ "reportCustom": "Tilpassa",
+ "reportToday": "Idag",
+ "reportYesterday": "I går",
+ "reportThisWeek": "Denne veka",
+ "reportPreviousWeek": "Forrige veke",
+ "reportThisMonth": "Denne månaden",
+ "reportPreviousMonth": "Forrige månad",
+ "reportDeviceName": "Einingsnamn",
+ "reportAverageSpeed": "Gjennomsnittshastighet",
+ "reportMaximumSpeed": "Maksimumshastighet",
+ "reportEngineHours": "Motortimar",
+ "reportDuration": "Varigheit",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Starttidspunkt",
+ "reportStartAddress": "Startadresse",
+ "reportEndTime": "Sluttidspunkt",
+ "reportEndAddress": "Sluttadresse",
+ "reportSpentFuel": "Brukt drivstoff",
+ "reportStartOdometer": "Kilometerteljar start",
+ "reportEndOdometer": "Kilometerteljar stop",
+ "statisticsTitle": "Statistikk",
+ "statisticsCaptureTime": "Opptakstid",
+ "statisticsActiveUsers": "Aktive brukarar",
+ "statisticsActiveDevices": "Aktive einingar",
+ "statisticsRequests": "Førespurnadar",
+ "statisticsMessagesReceived": "Meldingar motteke",
+ "statisticsMessagesStored": "Meldingar lagra",
+ "statisticsGeocoder": "Geocoder-førespurnader",
+ "statisticsGeolocation": "Geolocation-førespurnader",
+ "categoryArrow": "Pil",
+ "categoryDefault": "Standard",
+ "categoryAnimal": "Dyr",
+ "categoryBicycle": "Sykkel",
+ "categoryBoat": "Båt",
+ "categoryBus": "Buss",
+ "categoryCar": "Bil",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Kran",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motorsykkel",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Fly",
+ "categoryShip": "Skip",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Tog",
+ "categoryTram": "Trikk",
+ "categoryTrolleybus": "Trolleybuss",
+ "categoryTruck": "Lastebil",
+ "categoryVan": "Varebil",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Periode"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/pl.json b/legacy/web/l10n/pl.json
new file mode 100644
index 00000000..6e0a57d4
--- /dev/null
+++ b/legacy/web/l10n/pl.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Wczytywanie...",
+ "sharedHide": "Ukryj",
+ "sharedSave": "Zapisz",
+ "sharedUpload": "Wyślij",
+ "sharedSet": "Ustaw",
+ "sharedCancel": "Anuluj",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Dodaj",
+ "sharedEdit": "Edytuj",
+ "sharedRemove": "Usuń",
+ "sharedRemoveConfirm": "Usunąć obiekt?",
+ "sharedNoData": "Brak danych",
+ "sharedSubject": "Subject",
+ "sharedYes": "Tak",
+ "sharedNo": "Nie",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "Mm",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "w",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Godzina",
+ "sharedMinute": "Minuta",
+ "sharedSecond": "Sekunda",
+ "sharedDays": "dni",
+ "sharedHours": "godziny",
+ "sharedMinutes": "minuty",
+ "sharedDecimalDegrees": "Stopnie Dziesiętne",
+ "sharedDegreesDecimalMinutes": "Stopnie Dziesiętne Minuty",
+ "sharedDegreesMinutesSeconds": "Stopnie Minuty Sekundy",
+ "sharedName": "Nazwa",
+ "sharedDescription": "Opis",
+ "sharedSearch": "Szukaj",
+ "sharedIconScale": "Skala ikon",
+ "sharedGeofence": "Obszar monitorowany",
+ "sharedGeofences": "Obszary monitorowane",
+ "sharedCreateGeofence": "Utwórz obszar monitorowany",
+ "sharedNotifications": "Powiadomienia",
+ "sharedNotification": "Powiadomienie",
+ "sharedAttributes": "Atrybuty",
+ "sharedAttribute": "Atrybut",
+ "sharedDrivers": "Kierowcy",
+ "sharedDriver": "Kierowca",
+ "sharedArea": "Strefa",
+ "sharedSound": "Dźwięk powiadomienia",
+ "sharedType": "Typ",
+ "sharedDistance": "Odległość",
+ "sharedHourAbbreviation": "g",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Litr",
+ "sharedImpGallon": "Galon Ang.",
+ "sharedUsGallon": "Galon U.S.",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Pobierz stan mapy",
+ "sharedComputedAttribute": "Obliczony atrybut",
+ "sharedComputedAttributes": "Obliczone atrybuty",
+ "sharedCheckComputedAttribute": "Sprawdź obliczony atrybut",
+ "sharedExpression": "Wyrażenie",
+ "sharedDevice": "Urządzenie",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Wyślij powiadomienie testowe",
+ "sharedTestNotificators": "Kanały testowe",
+ "sharedTestExpression": "Wyrażenie testowe",
+ "sharedCalendar": "Kalendarz",
+ "sharedCalendars": "Kalendarze",
+ "sharedFile": "Plik",
+ "sharedSearchDevices": "Szukaj urządzeń",
+ "sharedSortBy": "Sortuj według",
+ "sharedFilterMap": "Filtruj na mapie",
+ "sharedSelectFile": "Wybierz plik",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Wymagane",
+ "sharedPreferences": "Preferencje",
+ "sharedPermissions": "Uprawnienia",
+ "sharedConnections": "Połączenia",
+ "sharedExtra": "Dodatkowe",
+ "sharedPrimary": "Podstawowy",
+ "sharedSecondary": "Drugorzędny",
+ "sharedTypeString": "Tekst",
+ "sharedTypeNumber": "Liczba",
+ "sharedTypeBoolean": "Wartość binarna",
+ "sharedTimezone": "Strefa czasowa",
+ "sharedInfoTitle": "Informacja",
+ "sharedSavedCommand": "Zapisane polecenie",
+ "sharedSavedCommands": "Zapisane polecenia",
+ "sharedNew": "Nowy...",
+ "sharedShowAddress": "Pokaż adres",
+ "sharedShowDetails": "Więcej szczegółów",
+ "sharedDisabled": "Wyłączony",
+ "sharedMaintenance": "Konserwacja",
+ "sharedDeviceAccumulators": "Akumulatory",
+ "sharedAlarms": "Alarmy",
+ "sharedLocation": "Lokalizacja",
+ "sharedImport": "Importuj",
+ "sharedColumns": "Kolumny",
+ "sharedDropzoneText": "Przeciągnij i upuść plik tutaj lub kliknij",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Prosty",
+ "calendarRecurrence": "Powtarzalny",
+ "calendarOnce": "Jednorazowy",
+ "calendarDaily": "Codzienny",
+ "calendarWeekly": "Tygodniowy",
+ "calendarMonthly": "Miesięczny",
+ "calendarDays": "Dzienny",
+ "calendarSunday": "Niedziela",
+ "calendarMonday": "Poniedziałek",
+ "calendarTuesday": "Wtorek",
+ "calendarWednesday": "Środa",
+ "calendarThursday": "Czwartek",
+ "calendarFriday": "Piątek",
+ "calendarSaturday": "Sobota",
+ "attributeShowGeofences": "Pokaż obszar monitorowany",
+ "attributeSpeedLimit": "Ograniczenie prędkości",
+ "attributeFuelDropThreshold": "Próg spadku paliwa",
+ "attributeFuelIncreaseThreshold": "Próg wzrostu paliwa",
+ "attributePolylineDistance": "Dystans łamanej",
+ "attributeReportIgnoreOdometer": "Raport: Ignoruj licznik kilometrów",
+ "attributeWebReportColor": "Web: Kolor raportu",
+ "attributeDevicePassword": "Hasło urządzenia",
+ "attributeDeviceImage": "Zdjęcie urządzenia",
+ "attributeDeviceInactivityStart": "Początek nieaktywności urządzenia",
+ "attributeDeviceInactivityPeriod": "Okres nieaktywności urządzenia",
+ "attributeProcessingCopyAttributes": "Przetwarzanie: Kopiuj atrybuty",
+ "attributeColor": "Kolor",
+ "attributeWebLiveRouteLength": "Web: Długość ścieżki na żywo",
+ "attributeWebSelectZoom": "Sieć: Powiększ po zaznaczeniu",
+ "attributeWebMaxZoom": "Strona: Maksymalne przybliżenie",
+ "attributeTelegramChatId": "Identyfikator czatu Telegram",
+ "attributePushoverUserKey": "Klucz użytkownika Pushover",
+ "attributePushoverDeviceNames": "Nazwy urządzeń Pushover",
+ "attributeMailSmtpHost": "Poczta: Nazwa hosta SMTP",
+ "attributeMailSmtpPort": "Poczta: Port SMTP",
+ "attributeMailSmtpStarttlsEnable": "Poczta: SMTP STARTTLS - Włącz",
+ "attributeMailSmtpStarttlsRequired": "Poczta: SMTP STARTTLS - Wymagane ",
+ "attributeMailSmtpSslEnable": "Poczta: SMTP SSL - Włącz",
+ "attributeMailSmtpSslTrust": "Poczta: SMTP SSL - Ufaj ",
+ "attributeMailSmtpSslProtocols": "Poczta: SMTP SSL - Protokoły ",
+ "attributeMailSmtpFrom": "Poczta: SMTP - Od",
+ "attributeMailSmtpAuth": "Poczta: SMTP - Włącz autoryzację",
+ "attributeMailSmtpUsername": "Poczta: SMTP - Nazwa użytkownika",
+ "attributeMailSmtpPassword": "Poczta: SMTP - Hasło",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Wyłącz atrybuty",
+ "attributeUiDisableGroups": "UI: Wyłącz grupy",
+ "attributeUiDisableEvents": "UI: Wyłącz zdarzenia",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Wyłącz kierowców",
+ "attributeUiDisableComputedAttributes": "UI: Wyłącz obliczone atrybuty",
+ "attributeUiDisableCalendars": "UI: Wyłącz kalendarze",
+ "attributeUiDisableMaintenance": "UI: Wyłącz konserwację",
+ "attributeUiHidePositionAttributes": "UI: Ukryj atrybuty pozycji",
+ "attributeUiDisableLoginLanguage": "UI: Wyłącz język logowania",
+ "attributeNotificationTokens": "Tokeny powiadomień",
+ "attributePopupInfo": "Wyskakujące informacje",
+ "errorTitle": "Błąd",
+ "errorGeneral": "Nieprawidłowe parametry lub naruszenie ograniczeń",
+ "errorConnection": "Błąd przy połączeniu",
+ "errorSocket": "Błąd połączenia gniazda sieciowego",
+ "errorZero": "Nie może być zerem",
+ "userEmail": "E-mail",
+ "userPassword": "Hasło",
+ "userAdmin": "Administrator",
+ "userRemember": "Zapamiętaj",
+ "userExpirationTime": "Wygaśnięcie",
+ "userDeviceLimit": "Limit urządzeń",
+ "userUserLimit": "Limit użytkownika",
+ "userDeviceReadonly": "Urządzenie do odczytu",
+ "userLimitCommands": "Ogranicz polecenia",
+ "userDisableReports": "Wyłącz raporty",
+ "userFixedEmail": "Bez zmiany adresu e-mail",
+ "userToken": "Token",
+ "userDeleteAccount": "Usuń konto",
+ "userTemporary": "Temporary",
+ "loginTitle": "Login",
+ "loginLanguage": "Język",
+ "loginReset": "Zresetuj hasło",
+ "loginRegister": "Rejestracja",
+ "loginLogin": "Zaloguj",
+ "loginOpenId": "Zaloguj się za pomocą OpenID",
+ "loginFailed": "Nieprawidłowy adres e-mail lub hasło",
+ "loginCreated": "Nowy użytkownik został zarejestrowany",
+ "loginResetSuccess": "Sprawdź swój e-mail",
+ "loginUpdateSuccess": "Nowe hasło zostało ustawione",
+ "loginLogout": "Wyloguj",
+ "loginLogo": "Logo",
+ "loginTotpCode": "Kod hasła jednorazowego",
+ "loginTotpKey": "Klucz hasła jednorazowego",
+ "devicesAndState": "Urządzenia i stan",
+ "deviceSelected": "Wybrane urządzenie",
+ "deviceTitle": "Urządzenia",
+ "devicePrimaryInfo": "Tytuł urządzenia",
+ "deviceSecondaryInfo": "Szczegóły urządzenia",
+ "deviceIdentifier": "Identyfikator",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategoria",
+ "deviceLastUpdate": "Ostatnia aktualizacja",
+ "deviceCommand": "Komenda",
+ "deviceFollow": "Podążaj",
+ "deviceTotalDistance": "Całkowity dystans",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Nieznany",
+ "deviceRegisterFirst": "Zarejestruj pierwsze urządzenie",
+ "deviceIdentifierHelp": "IMEI, numer seryjny lub inny identyfikator. Musi być zgodny z identyfikatorem raportującego urządzenia",
+ "deviceShare": "Share Device",
+ "groupDialog": "Grupa",
+ "groupParent": "Grupa",
+ "groupNoGroup": "Brak grupy",
+ "settingsTitle": "Ustawienia",
+ "settingsUser": "Konto",
+ "settingsGroups": "Grupy",
+ "settingsServer": "Serwer",
+ "settingsUsers": "Użytkownicy",
+ "settingsDistanceUnit": "Jednostka odległości",
+ "settingsAltitudeUnit": "Jednostka wysokości",
+ "settingsSpeedUnit": "Jednostka prędkości",
+ "settingsVolumeUnit": "Jednostka objętości",
+ "settingsTwelveHourFormat": "Format 12-godz.",
+ "settingsCoordinateFormat": "Format współrzędnych",
+ "settingsServerVersion": "Wersja serwera",
+ "settingsAppVersion": "Wersja aplikacji",
+ "settingsConnection": "Połączenie",
+ "settingsDarkMode": "Tryb ciemny",
+ "settingsTotpEnable": "Włącz hasło jednorazowe",
+ "settingsTotpForce": "Wymuś hasło jednorazowe",
+ "settingsServiceWorkerUpdateInterval": "Interwał aktualizacji ServiceWorkera",
+ "settingsUpdateAvailable": "Dostępna jest aktualizacja.",
+ "settingsSupport": "Support",
+ "reportTitle": "Raporty",
+ "reportScheduled": "Zaplanowane raporty",
+ "reportDevice": "Urządzenie",
+ "reportGroup": "Grupa",
+ "reportFrom": "Z",
+ "reportTo": "Do",
+ "reportShow": "Pokaż",
+ "reportClear": "Wyczyść",
+ "linkGoogleMaps": "Mapy Google",
+ "linkAppleMaps": "Mapy Apple",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Czas ustalenia pozycji",
+ "positionDeviceTime": "Czas urządzenia",
+ "positionServerTime": "Czas serwera",
+ "positionValid": "Aktywny",
+ "positionAccuracy": "Dokładność",
+ "positionLatitude": "Szerokość",
+ "positionLongitude": "Długość",
+ "positionAltitude": "Wysokość",
+ "positionSpeed": "Prędkość",
+ "positionCourse": "Kurs",
+ "positionAddress": "Adres",
+ "positionProtocol": "Protokół",
+ "positionDistance": "Odległość",
+ "positionRpm": "RPM",
+ "positionFuel": "Paliwo",
+ "positionPower": "Moc",
+ "positionBattery": "Bateria",
+ "positionRaw": "Surowy",
+ "positionIndex": "Indeks",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelity",
+ "positionSatVisible": "Widoczne satelity",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Zdarzenie",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Drogomierz",
+ "positionServiceOdometer": "Drogomierz usługi",
+ "positionTripOdometer": "Drogomierz podróży",
+ "positionHours": "Godziny",
+ "positionSteps": "Kroki",
+ "positionInput": "Wejście",
+ "positionHeartRate": "Tętno",
+ "positionOutput": "Wyjście",
+ "positionBatteryLevel": "Poziom baterii",
+ "positionFuelConsumption": "Zużycie paliwa",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Wersja firmware",
+ "positionVersionHw": "Wersja sprzętu",
+ "positionIgnition": "Zapłon",
+ "positionFlags": "Flagi",
+ "positionCharge": "Ładowanie",
+ "positionIp": "IP",
+ "positionArchive": "Archiwum",
+ "positionVin": "VIN",
+ "positionApproximate": "Przybliżony",
+ "positionThrottle": "Przepustnica",
+ "positionMotion": "Ruch",
+ "positionArmed": "Uzbrojony",
+ "positionAcceleration": "Przyśpieszenie",
+ "positionTemp": "Temperatura",
+ "positionDeviceTemp": "Temperatura urządzenia",
+ "positionCoolantTemp": "Temperatura płynu chłodzącego",
+ "positionOperator": "Operator",
+ "positionCommand": "Polecenie",
+ "positionBlocked": "Zablokowany",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Prędkość OBD",
+ "positionObdOdometer": "Drogomierz OBD",
+ "positionDrivingTime": "Czas podróży",
+ "positionDriverUniqueId": "Unikalny ID kierowcy",
+ "positionCard": "Karta",
+ "positionImage": "Obraz",
+ "positionVideo": "Wideo",
+ "positionAudio": "Dźwięk",
+ "serverTitle": "Ustawienia serwera",
+ "serverZoom": "Powiększenie",
+ "serverRegistration": "Rejestracja",
+ "serverReadonly": "Tylko do odczytu",
+ "serverForceSettings": "Wymuś ustawienia",
+ "serverAnnouncement": "Komunikat",
+ "serverName": "Nazwa serwera",
+ "serverDescription": "Opis serwera",
+ "serverColorPrimary": "Kolor podstawowy",
+ "serverColorSecondary": "Kolor drugorzędny",
+ "serverLogo": "Obraz logo",
+ "serverLogoInverted": "Odwrócony obraz logo",
+ "serverChangeDisable": "Wyłącz zmianę serwera",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Mapa",
+ "mapActive": "Aktywne mapy",
+ "mapOverlay": "Nakładka mapy",
+ "mapOverlayCustom": "Niestandardowa nakładka",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "Klucz API OpenWeather",
+ "mapOpenWeatherClouds": "Chmury OpenWeather",
+ "mapOpenWeatherPrecipitation": "Opady OpenWeather",
+ "mapOpenWeatherPressure": "Ciśnienie OpenWeather",
+ "mapOpenWeatherWind": "Wiatr OpenWeather",
+ "mapOpenWeatherTemperature": "Temperatura OpenWeather",
+ "mapLayer": "Rodzaj mapy",
+ "mapCustom": "Własny (XYZ)",
+ "mapCustomArcgis": "Własny (ArcGIS)",
+ "mapCustomLabel": "Własna mapa",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Spis uzbrojenia",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Token dostępu do Mapboxa",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "Klucz API MapTiler",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "Token dostępu LocationIQ",
+ "mapTomTomBasic": "Podstawowy TomTom",
+ "mapTomTomFlow": "Ruch drogowy TomTom",
+ "mapTomTomIncidents": "Wypadki drogowe TomTom",
+ "mapTomTomKey": "Klucz API TomTom",
+ "mapHereBasic": "Podstawowy Here",
+ "mapHereHybrid": "Hybrydowy Here",
+ "mapHereSatellite": "Satelitarny Here",
+ "mapHereFlow": "Ruch drogowy Here",
+ "mapHereKey": "Klucz API Here",
+ "mapShapePolygon": "Wielokąt",
+ "mapShapeCircle": "Okrąg",
+ "mapShapePolyline": "Krzywa",
+ "mapLiveRoutes": "Ścieżki na żywo",
+ "mapDirection": "Pokaż kierunek",
+ "mapCurrentLocation": "Aktualna lokalizacja",
+ "mapPoiLayer": "Warstwa POI",
+ "mapClustering": "Grupowanie znaczników",
+ "mapOnSelect": "Pokaż mapę w zaznaczeniu",
+ "mapDefault": "Mapa domyślna",
+ "stateTitle": "Stan i lokalizacja",
+ "stateName": "Właściwość",
+ "stateValue": "Wartość",
+ "commandTitle": "Komenda",
+ "commandSend": "Wyślij",
+ "commandSent": "Polecenie wysłane",
+ "commandQueued": "Polecenie zakolejkowane",
+ "commandUnit": "Jednostka",
+ "commandCustom": "Własna komenda",
+ "commandDeviceIdentification": "Identyfikacja urządzenia",
+ "commandPositionSingle": "Pojedyncze raportowanie",
+ "commandPositionPeriodic": "Okresowy raport",
+ "commandPositionStop": "Zatrzymaj raportowanie",
+ "commandEngineStop": "Silnik - Stop",
+ "commandEngineResume": "Silnik - Wznów",
+ "commandAlarmArm": "Włączanie alarmu",
+ "commandAlarmDisarm": "Wyłączanie alarmu",
+ "commandAlarmDismiss": "Odwołaj alarm",
+ "commandSetTimezone": "Ustaw strefę czasową",
+ "commandRequestPhoto": "Żądanie zdjęcia\n",
+ "commandPowerOff": "Wyłącz urządzenie",
+ "commandRebootDevice": "Zresetuj urządzenie",
+ "commandFactoryReset": "Przywrócenie ustawień fabrycznych",
+ "commandSendSms": "Wyślij SMS",
+ "commandSendUssd": "Wyślij USSD",
+ "commandSosNumber": "Ustaw numer SOS",
+ "commandSilenceTime": "Ustaw czas milczenia",
+ "commandSetPhonebook": "Ustaw książkę adresową",
+ "commandVoiceMessage": "Wiadomość głosowa",
+ "commandOutputControl": "Kontrola wyjścia",
+ "commandVoiceMonitoring": "Monitorowanie głosu",
+ "commandSetAgps": "Ustaw AGPS",
+ "commandSetIndicator": "Ustaw znacznik",
+ "commandConfiguration": "Konfiguracja",
+ "commandGetVersion": "Pobierz wersję",
+ "commandFirmwareUpdate": "Aktualizuj firmware",
+ "commandSetConnection": "Ustaw połączenie",
+ "commandSetOdometer": "Ustaw drogomierz",
+ "commandGetModemStatus": "Pobierz status modemu",
+ "commandGetDeviceStatus": "Pobierz status urządzenia",
+ "commandSetSpeedLimit": "Ustaw ograniczenie prędkości",
+ "commandModePowerSaving": "Tryb oszczędzania energii",
+ "commandModeDeepSleep": "Tryb głębokiego uśpienia",
+ "commandAlarmGeofence": "Ustaw alarm obszaru monitorowanego",
+ "commandAlarmBattery": "Ustaw alarm baterii",
+ "commandAlarmSos": "Ustaw alarm SOS",
+ "commandAlarmRemove": "Ustaw usunięcie alarmu",
+ "commandAlarmClock": "Ustaw alarm zegara",
+ "commandAlarmSpeed": "Ustaw alarm prędkości",
+ "commandAlarmFall": "Ustaw alarm upadku",
+ "commandAlarmVibration": "Ustaw alarm wibracji",
+ "commandFrequency": "Częstotliwość",
+ "commandTimezone": "Przesunięcie strefy czasowej",
+ "commandMessage": "Wiadomość",
+ "commandRadius": "Promień",
+ "commandEnable": "Włącz",
+ "commandData": "Dane",
+ "commandIndex": "Index",
+ "commandPhone": "Numer telefonu",
+ "commandServer": "Serwer",
+ "commandPort": "Port",
+ "eventAll": "Wszystkie zdarzenia",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status nieznany",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Urządzenie nieaktywne",
+ "eventQueuedCommandSent": "Wysłano polecenie z kolejki",
+ "eventDeviceMoving": "Urządzenie się porusza",
+ "eventDeviceStopped": "Urządzenie zatrzymane",
+ "eventDeviceOverspeed": "Przekroczono ograniczenie prędkości",
+ "eventDeviceFuelDrop": "Utrata paliwa",
+ "eventDeviceFuelIncrease": "Wzrost paliwa",
+ "eventCommandResult": "Rezultat polecenia",
+ "eventGeofenceEnter": "Wkroczono w obszar monitorowany",
+ "eventGeofenceExit": "Opuszczono obszar monitorowany",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Zapłon włączony",
+ "eventIgnitionOff": "Zapłon wyłączony",
+ "eventMaintenance": "Wymagana konserwacja",
+ "eventTextMessage": "Odebrano wiadomość tekstową",
+ "eventDriverChanged": "Zmieniana kierowcy",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Przewiń do ostatniego",
+ "eventsSoundEvents": "Dźwięk wydarzeń",
+ "eventsSoundAlarms": "Dźwięk alarmów",
+ "alarmGeneral": "Ogólny",
+ "alarmSos": "SOS",
+ "alarmVibration": "WIbracja",
+ "alarmMovement": "Ruch",
+ "alarmLowspeed": "Niska prędkość",
+ "alarmOverspeed": "Przekroczenie prędkości",
+ "alarmFallDown": "Upadek",
+ "alarmLowPower": "Mało energii",
+ "alarmLowBattery": "Niski stan baterii",
+ "alarmFault": "Błąd",
+ "alarmPowerOff": "Wyłączenie zasilania",
+ "alarmPowerOn": "Włączenie zasilania",
+ "alarmDoor": "Drzwi",
+ "alarmLock": "Zamknięty",
+ "alarmUnlock": "Otwarty",
+ "alarmGeofence": "Obszar monitorowany",
+ "alarmGeofenceEnter": "Obszar monitorowany wejście",
+ "alarmGeofenceExit": "Obszar monitorowany wyjście",
+ "alarmGpsAntennaCut": "Odłączenie anteny GPS",
+ "alarmAccident": "Wypadek",
+ "alarmTow": "Holowanie",
+ "alarmIdle": "Bezczynność",
+ "alarmHighRpm": "Wysokie obroty silnika",
+ "alarmHardAcceleration": "Mocne przyśpiesznie",
+ "alarmHardBraking": "Mocne hamowanie",
+ "alarmHardCornering": "Ostre zakręty",
+ "alarmLaneChange": "Zmiana pasa ruchu",
+ "alarmFatigueDriving": "Zmęczenie",
+ "alarmPowerCut": "Odcięcie zasilania",
+ "alarmPowerRestored": "Zasilanie przywrócone",
+ "alarmJamming": "Zakłócanie",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Parkowanie",
+ "alarmBonnet": "Maska",
+ "alarmFootBrake": "Hamulec nożny",
+ "alarmFuelLeak": "Wyciek paliwa",
+ "alarmTampering": "Manipulacja",
+ "alarmRemoving": "Usuwanie",
+ "notificationType": "Rodzaj powiadomienia",
+ "notificationAlways": "Wszystkie urządzenia",
+ "notificationNotificators": "Kanały",
+ "notificatorCommand": "Komenda",
+ "notificatorWeb": "Sieć",
+ "notificatorMail": "Poczta",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Odtwórz",
+ "reportCombined": "Połączone",
+ "reportRoute": "Trasa",
+ "reportEvents": "Zdarzenia",
+ "reportTrips": "Podróże",
+ "reportStops": "Zatrzymania",
+ "reportSummary": "Podsumowanie",
+ "reportDaily": "Podsumowanie dzienne",
+ "reportChart": "Wykres",
+ "reportConfigure": "Konfiguracja",
+ "reportEventTypes": "Rodzaje zdarzeń",
+ "reportChartType": "Typ wykresu",
+ "reportShowMarkers": "Pokaż znaczniki",
+ "reportExport": "Eksportuj",
+ "reportEmail": "Raport e-mailowy",
+ "reportSchedule": "Zaplanuj",
+ "reportPeriod": "Okres",
+ "reportCustom": "Własny",
+ "reportToday": "Dzisiaj",
+ "reportYesterday": "Wczoraj",
+ "reportThisWeek": "W tym tygodniu",
+ "reportPreviousWeek": "W poprzednim tygodniu",
+ "reportThisMonth": "W tym miesiącu",
+ "reportPreviousMonth": "W poprzednim miesiącu",
+ "reportDeviceName": "Nazwa urządzenia",
+ "reportAverageSpeed": "Średnia prędkość",
+ "reportMaximumSpeed": "Maksymalna prędkość",
+ "reportEngineHours": "Czas pracy silnika",
+ "reportDuration": "Czas trwania",
+ "reportStartDate": "Data początkowa",
+ "reportStartTime": "Czas uruchomienia",
+ "reportStartAddress": "Adres początkowy",
+ "reportEndTime": "Czas końcowy",
+ "reportEndAddress": "Adres końcowy",
+ "reportSpentFuel": "Zużyte paliwo",
+ "reportStartOdometer": "Start drogomierza",
+ "reportEndOdometer": "Stop drogomierza",
+ "statisticsTitle": "Statystyki",
+ "statisticsCaptureTime": "Czas zapisu",
+ "statisticsActiveUsers": "Aktywni użytkownicy",
+ "statisticsActiveDevices": "Aktywne urządzenia",
+ "statisticsRequests": "Żądania",
+ "statisticsMessagesReceived": "Odebrane wiadomości",
+ "statisticsMessagesStored": "Zapisane wiadomości",
+ "statisticsGeocoder": "Żądania Geokodera",
+ "statisticsGeolocation": "Żądania geolokacji",
+ "categoryArrow": "Strzałka",
+ "categoryDefault": "Domyślny",
+ "categoryAnimal": "Zwierzę",
+ "categoryBicycle": "Rower",
+ "categoryBoat": "Łódź",
+ "categoryBus": "Autobus",
+ "categoryCar": "Samochód",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Dźwig",
+ "categoryHelicopter": "Śmigłowiec",
+ "categoryMotorcycle": "Motocykl",
+ "categoryOffroad": "Pojazd terenowy",
+ "categoryPerson": "Osoba",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Samolot",
+ "categoryShip": "Statek",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Pociąg",
+ "categoryTram": "Tramwaj",
+ "categoryTrolleybus": "Trolejbus",
+ "categoryTruck": "Ciężarówka",
+ "categoryVan": "Van",
+ "categoryScooter": "Skuter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Okres"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/pt.json b/legacy/web/l10n/pt.json
new file mode 100644
index 00000000..66181d39
--- /dev/null
+++ b/legacy/web/l10n/pt.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "A Carregar...",
+ "sharedHide": "Ocultar",
+ "sharedSave": "Guardar",
+ "sharedUpload": "Upload",
+ "sharedSet": "Conjunto",
+ "sharedCancel": "Cancelar",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Adicionar",
+ "sharedEdit": "Editar",
+ "sharedRemove": "Remover",
+ "sharedRemoveConfirm": "Remover item?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Sim",
+ "sharedNo": "Não",
+ "sharedKm": "Km",
+ "sharedMi": "Mi",
+ "sharedNmi": "Nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "Km/h",
+ "sharedKmh": "Km/h",
+ "sharedMph": "Mph",
+ "sharedHour": "Hora",
+ "sharedMinute": "Minuto",
+ "sharedSecond": "Segundo",
+ "sharedDays": "Dias",
+ "sharedHours": "Horas",
+ "sharedMinutes": "Minutos",
+ "sharedDecimalDegrees": "Graus Decimais",
+ "sharedDegreesDecimalMinutes": "Graus Decimais Minutos",
+ "sharedDegreesMinutesSeconds": "Graus Decimais Segundos",
+ "sharedName": "Nome",
+ "sharedDescription": "Descrição",
+ "sharedSearch": "Pesquisar",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Cerca Geográfica",
+ "sharedGeofences": "Cercas Geográficas",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Notificações",
+ "sharedNotification": "Notificação",
+ "sharedAttributes": "Atributos",
+ "sharedAttribute": "Atributo",
+ "sharedDrivers": "Condutores",
+ "sharedDriver": "Condutor",
+ "sharedArea": "Área",
+ "sharedSound": "Notificação Sonora",
+ "sharedType": "Tipo",
+ "sharedDistance": "Distância",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "Volts",
+ "sharedLiterAbbreviation": "Litros",
+ "sharedGallonAbbreviation": "Gal",
+ "sharedLiter": "Litro",
+ "sharedImpGallon": "Galão Imp.",
+ "sharedUsGallon": "Galão U.S.",
+ "sharedLiterPerHourAbbreviation": "Litros/Hora",
+ "sharedGetMapState": "Obter Estado do Mapa",
+ "sharedComputedAttribute": "Atributo",
+ "sharedComputedAttributes": "Atributos",
+ "sharedCheckComputedAttribute": "Verificar Atributos",
+ "sharedExpression": "Expressão",
+ "sharedDevice": "Dispositivo",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Enviar Notificação Teste",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Calendário",
+ "sharedCalendars": "Calendários",
+ "sharedFile": "Ficheiro",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Seleccionar Ficheiro",
+ "sharedPhone": "Telefone",
+ "sharedRequired": "Exigido",
+ "sharedPreferences": "Preferências",
+ "sharedPermissions": "Permissões",
+ "sharedConnections": "Conexões",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Corda",
+ "sharedTypeNumber": "Número",
+ "sharedTypeBoolean": "Boleano",
+ "sharedTimezone": "Fuso-Horário",
+ "sharedInfoTitle": "Informação",
+ "sharedSavedCommand": "Comando Gravado",
+ "sharedSavedCommands": "Comandos Gravados",
+ "sharedNew": "Novo...",
+ "sharedShowAddress": "Mostrar Morada",
+ "sharedShowDetails": "Mais Detalhes",
+ "sharedDisabled": "Desativado",
+ "sharedMaintenance": "Manutenção",
+ "sharedDeviceAccumulators": "Acumuladores",
+ "sharedAlarms": "Alarmes",
+ "sharedLocation": "Localização",
+ "sharedImport": "Importar",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Limite de Velocidade",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Distância Polilinha",
+ "attributeReportIgnoreOdometer": "Relatório: Ignorar Conta-Quilómetros",
+ "attributeWebReportColor": "Web: Cor do Relatório",
+ "attributeDevicePassword": "Password do Dispositivo",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Inicio da Inatividade do Dispositivo",
+ "attributeDeviceInactivityPeriod": "Período de Inatividade do Dispositivo",
+ "attributeProcessingCopyAttributes": "Processando: Cópia dos Atributos",
+ "attributeColor": "Cor",
+ "attributeWebLiveRouteLength": "Web: Comprimento da Rota ao Vivo",
+ "attributeWebSelectZoom": "Web: Zoom na Selecção",
+ "attributeWebMaxZoom": "Web: Zoom Máximo",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: Alojamento SMTP",
+ "attributeMailSmtpPort": "Mail: Porta SMTP",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS Activo",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS Necessário",
+ "attributeMailSmtpSslEnable": "Mail: SMTP SSL Activo",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL Verificado",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP Protocolos SSL",
+ "attributeMailSmtpFrom": "Mail: SMTP de",
+ "attributeMailSmtpAuth": "Mail: SMTP Autenticação Activa",
+ "attributeMailSmtpUsername": "Mail: Utilizador SMTP",
+ "attributeMailSmtpPassword": "Mail: Password SMTP",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Desativar Eventos",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Desativar Condutores",
+ "attributeUiDisableComputedAttributes": "UI: Desativar Atributos",
+ "attributeUiDisableCalendars": "UI: Desativar Calendários",
+ "attributeUiDisableMaintenance": "Desativar Manutenção",
+ "attributeUiHidePositionAttributes": "UI: Ocultar Atributos de Localização",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Tokens de Notificação",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Erro",
+ "errorGeneral": "Parâmetros Inválidos",
+ "errorConnection": "Erro de conexão",
+ "errorSocket": "Erro de Conexão",
+ "errorZero": "Não pode ser zero",
+ "userEmail": "Utilizador",
+ "userPassword": "Senha",
+ "userAdmin": "Administrador",
+ "userRemember": "Relembrar",
+ "userExpirationTime": "Expira em:",
+ "userDeviceLimit": "Limite de Dispositivos",
+ "userUserLimit": "Limite de Utilizadores",
+ "userDeviceReadonly": "Leitura de Dispositivo",
+ "userLimitCommands": "Limite de Comandos",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Símbolo",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Entrar",
+ "loginLanguage": "Idioma",
+ "loginReset": "Reset Password",
+ "loginRegister": "Registar",
+ "loginLogin": "Entrar",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Dados incorrectos ou inexistentes",
+ "loginCreated": "Novo utilizador foi registado",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Sair",
+ "loginLogo": "Logótipo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Dispositivos e Estados",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Dispositivos",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identificador",
+ "deviceModel": "Modelo",
+ "deviceContact": "Contacto",
+ "deviceCategory": "Categoria",
+ "deviceLastUpdate": "Ultima Actualização",
+ "deviceCommand": "Comando",
+ "deviceFollow": "Seguir",
+ "deviceTotalDistance": "Distancia Total",
+ "deviceStatus": "Estado",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Desconhecido",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Grupo",
+ "groupParent": "Grupo",
+ "groupNoGroup": "Sem Grupo",
+ "settingsTitle": "Configurações",
+ "settingsUser": "Conta",
+ "settingsGroups": "Grupos",
+ "settingsServer": "Servidor",
+ "settingsUsers": "Utilizadores",
+ "settingsDistanceUnit": "Unidade de Distância",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Unidade de Velocidade",
+ "settingsVolumeUnit": "Unidade de Volume",
+ "settingsTwelveHourFormat": "Formato 12 Horas",
+ "settingsCoordinateFormat": "Formato das Coordenadas",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Relatórios",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Dispositivo",
+ "reportGroup": "Grupo",
+ "reportFrom": "De",
+ "reportTo": "Para",
+ "reportShow": "Mostrar",
+ "reportClear": "Limpar",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Válido",
+ "positionAccuracy": "Precisão",
+ "positionLatitude": "Latitude",
+ "positionLongitude": "Longitude",
+ "positionAltitude": "Altitude",
+ "positionSpeed": "Velocidade",
+ "positionCourse": "Direcção",
+ "positionAddress": "Morada",
+ "positionProtocol": "Protocolo",
+ "positionDistance": "Distância",
+ "positionRpm": "Rpm",
+ "positionFuel": "Combustível",
+ "positionPower": "Potência",
+ "positionBattery": "Bateria",
+ "positionRaw": "Aberto",
+ "positionIndex": "Início",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelites",
+ "positionSatVisible": "Satelites Visiveis",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Evento",
+ "positionAlarm": "Alarme",
+ "positionStatus": "Estado",
+ "positionOdometer": "Conta-Quilómetros",
+ "positionServiceOdometer": "Serviço Conta-Quilómetros",
+ "positionTripOdometer": "Conta-Quilómetros de Viagem",
+ "positionHours": "Horas",
+ "positionSteps": "Posições",
+ "positionInput": "Dentro",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Fora",
+ "positionBatteryLevel": "Nível da Bateria",
+ "positionFuelConsumption": "Consumo de Combustível",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Versão de Firmware",
+ "positionVersionHw": "Versão de Hardware",
+ "positionIgnition": "Ignição",
+ "positionFlags": "Bandeiras",
+ "positionCharge": "Carregar",
+ "positionIp": "IP",
+ "positionArchive": "Arquivo",
+ "positionVin": "VIN",
+ "positionApproximate": "Aproximação",
+ "positionThrottle": "Acelerador",
+ "positionMotion": "Movimento",
+ "positionArmed": "Armado",
+ "positionAcceleration": "Aceleração",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Temperatura do Dispositivo",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operador",
+ "positionCommand": "Comando",
+ "positionBlocked": "Bloqueado",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Velocidade OBD",
+ "positionObdOdometer": "Conta-Quilómetros OBD",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Identificação do Condutor",
+ "positionCard": "Card",
+ "positionImage": "Imagem",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Configurações do Servidor",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registo",
+ "serverReadonly": "Apenas Leitura",
+ "serverForceSettings": "Forçar Configurações",
+ "serverAnnouncement": "Anúncio",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Mapa",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Aspecto do Mapa",
+ "mapCustom": "Padrão (XYZ)",
+ "mapCustomArcgis": "Padrão (ArcGIS)",
+ "mapCustomLabel": "Mapa Personalizado",
+ "mapCarto": "Mapa Carto",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Mapa Bing Key",
+ "mapBingRoad": "Mapa Bing Road",
+ "mapBingAerial": "Mapa Bing Aéreo",
+ "mapBingHybrid": "Mapa Bing Híbrido",
+ "mapBaidu": "Mapa Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Mapa Yandex",
+ "mapYandexSat": "Mapa Yandex Satélite",
+ "mapWikimedia": "Mapa Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Ruas",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox ao ar livre",
+ "mapMapboxSatellite": "Mapbox Satélite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polígono",
+ "mapShapeCircle": "Circulo",
+ "mapShapePolyline": "Linha Polígono",
+ "mapLiveRoutes": "Rotas ao Vivo",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "Camada POI",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Estado",
+ "stateName": "Parâmetro",
+ "stateValue": "Valor",
+ "commandTitle": "Comando",
+ "commandSend": "Enviar",
+ "commandSent": "Comando Enviado",
+ "commandQueued": "Comando foi para a fila",
+ "commandUnit": "Unidade",
+ "commandCustom": "Comando Personalizado",
+ "commandDeviceIdentification": "Identificação do Dispositivo",
+ "commandPositionSingle": "Relatórios Únicos",
+ "commandPositionPeriodic": "Relatório Periódico",
+ "commandPositionStop": "Parar Posição",
+ "commandEngineStop": "Parar Motor",
+ "commandEngineResume": "Desbloqueio do Motor",
+ "commandAlarmArm": "Armar Alarme",
+ "commandAlarmDisarm": "Desarmar Alarme",
+ "commandAlarmDismiss": "Alarme Dispensado",
+ "commandSetTimezone": "Definir Fuso Horário",
+ "commandRequestPhoto": "Solicitar Foto",
+ "commandPowerOff": "Dispositivo Desligado",
+ "commandRebootDevice": "Reiniciar Dispositivo",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Enviar SMS",
+ "commandSendUssd": "Enviar USSD",
+ "commandSosNumber": "Definir Numero SOS",
+ "commandSilenceTime": "Definir Tempo de Silencio",
+ "commandSetPhonebook": "Definir Agenda",
+ "commandVoiceMessage": "Mensagem de Voz",
+ "commandOutputControl": "Controlo de Saída",
+ "commandVoiceMonitoring": "Monitorização de Voz",
+ "commandSetAgps": "Definir AGPS",
+ "commandSetIndicator": "Definir Indicador",
+ "commandConfiguration": "Configuração",
+ "commandGetVersion": "Obter Versão",
+ "commandFirmwareUpdate": "Actualizar Firmware",
+ "commandSetConnection": "Estabelecer Ligação",
+ "commandSetOdometer": "Conta-Quilómetros",
+ "commandGetModemStatus": "Estado do Modem",
+ "commandGetDeviceStatus": "Obter Estado do Dispositivos",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frequência",
+ "commandTimezone": "Deslocamento do Fuso Horário",
+ "commandMessage": "Mensagem",
+ "commandRadius": "Radiação",
+ "commandEnable": "Ativar",
+ "commandData": "Dados",
+ "commandIndex": "Inicio",
+ "commandPhone": "Número de Telefone",
+ "commandServer": "Servidor",
+ "commandPort": "Porta",
+ "eventAll": "Todos os Eventos",
+ "eventDeviceOnline": "Dispositivo Conectado",
+ "eventDeviceUnknown": "Estado do dispositivo desconhecido",
+ "eventDeviceOffline": "Estado Desligado",
+ "eventDeviceInactive": "Dispositivo Inativo",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Dispositivo em Movimento",
+ "eventDeviceStopped": "Dispositivo Parado",
+ "eventDeviceOverspeed": "Atingido o Excesso de Velocidade",
+ "eventDeviceFuelDrop": "Perda de Combústivel",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Resultado do Comando",
+ "eventGeofenceEnter": "Entrou na Cerca Geográfica",
+ "eventGeofenceExit": "Saiu da Cerca Geográfica",
+ "eventAlarm": "Alarme",
+ "eventIgnitionOn": "Ignição Ligada",
+ "eventIgnitionOff": "Ignição Desligada",
+ "eventMaintenance": "Necessária Manutenção",
+ "eventTextMessage": "Mensagem de Texto Recebida",
+ "eventDriverChanged": "Alteração de Condutor",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Puxar para o Fim",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Geral",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibração",
+ "alarmMovement": "Movimento",
+ "alarmLowspeed": "Baixa Velocidade",
+ "alarmOverspeed": "Excesso de Velocidade",
+ "alarmFallDown": "Queda",
+ "alarmLowPower": "Potência Baixa",
+ "alarmLowBattery": "Bateria Fraca",
+ "alarmFault": "Falha",
+ "alarmPowerOff": "Desligado",
+ "alarmPowerOn": "Ligado",
+ "alarmDoor": "Porta",
+ "alarmLock": "Bloqueio",
+ "alarmUnlock": "Desbloqueio",
+ "alarmGeofence": "Cerca Geográfica",
+ "alarmGeofenceEnter": "Entrada na Cerca Geográfica",
+ "alarmGeofenceExit": "Saída da Cerca Geográfica",
+ "alarmGpsAntennaCut": "Corte de Antena GPS",
+ "alarmAccident": "Acidente",
+ "alarmTow": "Reboque",
+ "alarmIdle": "Inútil",
+ "alarmHighRpm": "RPM Alta",
+ "alarmHardAcceleration": "Aceleração Brusca",
+ "alarmHardBraking": "Travagem Brusca",
+ "alarmHardCornering": "Viragem Brusca",
+ "alarmLaneChange": "Mudança de Faixa",
+ "alarmFatigueDriving": "Condução Cansada",
+ "alarmPowerCut": "Alarme de Corte de Corrente",
+ "alarmPowerRestored": "Alarme de Energia Restaurado",
+ "alarmJamming": "Alarme de Bloqueio",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Estacionamento",
+ "alarmBonnet": "Alarme do Capô",
+ "alarmFootBrake": "Alarme de Travão de Mão",
+ "alarmFuelLeak": "Perda de Combustivel",
+ "alarmTampering": "Adulteração",
+ "alarmRemoving": "Removendo",
+ "notificationType": "Tipo de Notificação",
+ "notificationAlways": "Todos os Dispositivos",
+ "notificationNotificators": "Vias",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "E-Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Histórico de Rotas",
+ "reportEvents": "Eventos",
+ "reportTrips": "Viagens",
+ "reportStops": "Paragens",
+ "reportSummary": "Resumo",
+ "reportDaily": "Resumo Diário",
+ "reportChart": "Gráfico",
+ "reportConfigure": "Configurar",
+ "reportEventTypes": "Tipos de Eventos",
+ "reportChartType": "Tipo de Gráfico",
+ "reportShowMarkers": "Mostrar Marcadores",
+ "reportExport": "Exportar",
+ "reportEmail": "Relatório de Email",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Periodo",
+ "reportCustom": "Personalização",
+ "reportToday": "Hoje",
+ "reportYesterday": "Ontem",
+ "reportThisWeek": "Esta Semana",
+ "reportPreviousWeek": "Semana Passada",
+ "reportThisMonth": "Este Mês",
+ "reportPreviousMonth": "Mês Passado",
+ "reportDeviceName": "Nome do Dispositivo",
+ "reportAverageSpeed": "Velocidade Média",
+ "reportMaximumSpeed": "Velocidade Máxima",
+ "reportEngineHours": "Duração Ligado",
+ "reportDuration": "Duração",
+ "reportStartDate": "Data de Início",
+ "reportStartTime": "Hora de Inicio",
+ "reportStartAddress": "Morada Inicial",
+ "reportEndTime": "Hora de Fim",
+ "reportEndAddress": "Morada Final",
+ "reportSpentFuel": "Combustível Gasto",
+ "reportStartOdometer": "Início do Conta-Quilómetros",
+ "reportEndOdometer": "Fim do Conta-Quilómetros",
+ "statisticsTitle": "Estatísticas",
+ "statisticsCaptureTime": "Data",
+ "statisticsActiveUsers": "Utilizadores Activos",
+ "statisticsActiveDevices": "Dispositivos Activos",
+ "statisticsRequests": "Pedidos",
+ "statisticsMessagesReceived": "Mensagens Recebidas",
+ "statisticsMessagesStored": "Mensagens Armazenadas",
+ "statisticsGeocoder": "Pedidos de Codificador Geográfico",
+ "statisticsGeolocation": "Pedidos de Geo Localização",
+ "categoryArrow": "Seta",
+ "categoryDefault": "Padrão",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicicleta",
+ "categoryBoat": "Barco",
+ "categoryBus": "Autocarro",
+ "categoryCar": "Carro",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Guindaste",
+ "categoryHelicopter": "Helicóptero",
+ "categoryMotorcycle": "Mota",
+ "categoryOffroad": "Jipe",
+ "categoryPerson": "Pessoa",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Avião",
+ "categoryShip": "Barco",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Comboio",
+ "categoryTram": "Eléctrico",
+ "categoryTrolleybus": "Autocarro Eléctrico",
+ "categoryTruck": "Camião",
+ "categoryVan": "Caravana",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Iniciar",
+ "maintenancePeriod": "Período"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/pt_BR.json b/legacy/web/l10n/pt_BR.json
new file mode 100644
index 00000000..7f47050f
--- /dev/null
+++ b/legacy/web/l10n/pt_BR.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Carregando...",
+ "sharedHide": "oculto",
+ "sharedSave": "Salvar",
+ "sharedUpload": "Enviar",
+ "sharedSet": "Aplicar",
+ "sharedCancel": "Cancelar",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Adicionar",
+ "sharedEdit": "Editar",
+ "sharedRemove": "Remover",
+ "sharedRemoveConfirm": "Remover item?",
+ "sharedNoData": "Sem dados",
+ "sharedSubject": "Subject",
+ "sharedYes": "Sim",
+ "sharedNo": "Não",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "Milhas Náuticas",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Hora",
+ "sharedMinute": "Minuto",
+ "sharedSecond": "Segundo",
+ "sharedDays": "dias",
+ "sharedHours": "horas",
+ "sharedMinutes": "minutos",
+ "sharedDecimalDegrees": "Graus Decimais",
+ "sharedDegreesDecimalMinutes": "Graus Minutos Decimais",
+ "sharedDegreesMinutesSeconds": "Graus Minutos Segundos",
+ "sharedName": "Nome",
+ "sharedDescription": "Descrição",
+ "sharedSearch": "Busca",
+ "sharedIconScale": "Escala do ícone",
+ "sharedGeofence": "Geocerca",
+ "sharedGeofences": "Cerca Virtual",
+ "sharedCreateGeofence": "Criar cerca",
+ "sharedNotifications": "Notificações",
+ "sharedNotification": "Notificação",
+ "sharedAttributes": "Atributos",
+ "sharedAttribute": "Atributo",
+ "sharedDrivers": "Motoristas",
+ "sharedDriver": "Motorista",
+ "sharedArea": "Área",
+ "sharedSound": "Som de notificação",
+ "sharedType": "Tipo",
+ "sharedDistance": "Distância",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "L",
+ "sharedGallonAbbreviation": "Galão",
+ "sharedLiter": "Litro",
+ "sharedImpGallon": "Imp. Galão",
+ "sharedUsGallon": "U.S. Galão",
+ "sharedLiterPerHourAbbreviation": "L/h",
+ "sharedGetMapState": "Obter estado do mapa",
+ "sharedComputedAttribute": "Atributo Calculado",
+ "sharedComputedAttributes": "Atributos Calculados",
+ "sharedCheckComputedAttribute": "Verificar Atributo Calculado",
+ "sharedExpression": "Expressão",
+ "sharedDevice": "Dispositivo",
+ "sharedTest": "Teste",
+ "sharedTestNotification": "Enviar notificação de teste",
+ "sharedTestNotificators": "Canais de Teste",
+ "sharedTestExpression": "Expressão de teste",
+ "sharedCalendar": "Calendário",
+ "sharedCalendars": "Calendários",
+ "sharedFile": "Arquivo",
+ "sharedSearchDevices": "Pesquisar Dispositivos",
+ "sharedSortBy": "Organizar por",
+ "sharedFilterMap": "Filtrar no mapa",
+ "sharedSelectFile": "Selecionar Arquivo",
+ "sharedPhone": "Telefone",
+ "sharedRequired": "Necessário",
+ "sharedPreferences": "Preferências",
+ "sharedPermissions": "Permissões",
+ "sharedConnections": "Conexões",
+ "sharedExtra": "Adicional",
+ "sharedPrimary": "Primário",
+ "sharedSecondary": "Secundário",
+ "sharedTypeString": "Texto",
+ "sharedTypeNumber": "Número",
+ "sharedTypeBoolean": "Lógico",
+ "sharedTimezone": "Fuso horário",
+ "sharedInfoTitle": "Informação",
+ "sharedSavedCommand": "Comando Salvo",
+ "sharedSavedCommands": "Comandos Salvos",
+ "sharedNew": "Novo...",
+ "sharedShowAddress": "Mostrar Endereço",
+ "sharedShowDetails": "Mais Detalhes",
+ "sharedDisabled": "Desativado",
+ "sharedMaintenance": "Manutenção",
+ "sharedDeviceAccumulators": "Contadores",
+ "sharedAlarms": "Alarmes",
+ "sharedLocation": "Localização",
+ "sharedImport": "Importar",
+ "sharedColumns": "Colunas",
+ "sharedDropzoneText": "Arraste e solte um arquivo aqui ou clique",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simples",
+ "calendarRecurrence": "Recorrência",
+ "calendarOnce": "Uma vez",
+ "calendarDaily": "Diariamente",
+ "calendarWeekly": "Semanalmente",
+ "calendarMonthly": "Mensalmente",
+ "calendarDays": "Dias",
+ "calendarSunday": "Domingo",
+ "calendarMonday": "Segunda-feira",
+ "calendarTuesday": "Terça-feira",
+ "calendarWednesday": "Quarta-feira",
+ "calendarThursday": "Quinta-feira",
+ "calendarFriday": "Sexta-feira",
+ "calendarSaturday": "Sábado",
+ "attributeShowGeofences": "Exibir Cerca Virtual",
+ "attributeSpeedLimit": "Limite de Velocidade",
+ "attributeFuelDropThreshold": "Limite de decréscimo de combustível",
+ "attributeFuelIncreaseThreshold": "Limite de acréscimo de combustível",
+ "attributePolylineDistance": "Distância da Polilinha",
+ "attributeReportIgnoreOdometer": "Relatório: Ignorar Odômetro",
+ "attributeWebReportColor": "Web: Cor do Relatório",
+ "attributeDevicePassword": "Senha do Dispositivo",
+ "attributeDeviceImage": "Imagem",
+ "attributeDeviceInactivityStart": "Início de inatividade do dispositivo",
+ "attributeDeviceInactivityPeriod": "Período de inatividade do dispositivo",
+ "attributeProcessingCopyAttributes": "Processamento: Copiar Atributos",
+ "attributeColor": "Cor",
+ "attributeWebLiveRouteLength": "Web: Comprimento da Rota ao Vivo",
+ "attributeWebSelectZoom": "Web: Zoom Selecionado",
+ "attributeWebMaxZoom": "Web: Zoom Máximo",
+ "attributeTelegramChatId": "ID do Chat do Telegram",
+ "attributePushoverUserKey": "Chave de usuário do Pushover",
+ "attributePushoverDeviceNames": "Nomes de dispositivos do Pushover",
+ "attributeMailSmtpHost": "Email: Host SMTP",
+ "attributeMailSmtpPort": "Email: Porta SMTP",
+ "attributeMailSmtpStarttlsEnable": "Email: Ativar STARTTLS (SMTP)",
+ "attributeMailSmtpStarttlsRequired": "Email: SMTP START TLS Obrigatório",
+ "attributeMailSmtpSslEnable": "Email: Ativar SSL (SMTP)",
+ "attributeMailSmtpSslTrust": "Email: Certificado SSL (SMTP)",
+ "attributeMailSmtpSslProtocols": "Email: Protocolo SSL (SMTP)",
+ "attributeMailSmtpFrom": "Email: Remetente",
+ "attributeMailSmtpAuth": "Email: Ativar Autenticação (SMTP)",
+ "attributeMailSmtpUsername": "Email: Nome de Usuário (SMTP)",
+ "attributeMailSmtpPassword": "Email: Senha (SMTP)",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Desativar atributos",
+ "attributeUiDisableGroups": "UI: Desabilitar Grupos",
+ "attributeUiDisableEvents": "UI: Eventos Desativados",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Desativar Motoristas",
+ "attributeUiDisableComputedAttributes": "UI: Desativar Atributos Calculados",
+ "attributeUiDisableCalendars": "UI: Desativar Calendários",
+ "attributeUiDisableMaintenance": "UI: Desativar Manutenção",
+ "attributeUiHidePositionAttributes": "UI: Ocultar os atributos de posição",
+ "attributeUiDisableLoginLanguage": "UI: Desativar idioma de login",
+ "attributeNotificationTokens": "Token de Notificação",
+ "attributePopupInfo": "Informações no Pop-up",
+ "errorTitle": "Erro",
+ "errorGeneral": "Parâmetros inválidos ou violação de restrições",
+ "errorConnection": "Erro de conexão",
+ "errorSocket": "Erro na conexão com Web Socket",
+ "errorZero": "Não pode ser zero",
+ "userEmail": "Email",
+ "userPassword": "Senha",
+ "userAdmin": "Admin",
+ "userRemember": "Lembrar",
+ "userExpirationTime": "Validade",
+ "userDeviceLimit": "Limite de dispositivos",
+ "userUserLimit": "Limite de Usuários",
+ "userDeviceReadonly": "Dispositivos somente leitura",
+ "userLimitCommands": "Limite de Comandos",
+ "userDisableReports": "Desabilitar Relatórios",
+ "userFixedEmail": "Sem alteração de e-mail",
+ "userToken": "Token",
+ "userDeleteAccount": "Deletar conta",
+ "userTemporary": "Temporary",
+ "loginTitle": "Login",
+ "loginLanguage": "Idioma",
+ "loginReset": "Redefinir senha",
+ "loginRegister": "Registrar",
+ "loginLogin": "Entrar",
+ "loginOpenId": "Logar com OpenID",
+ "loginFailed": "Email ou senha incorretos",
+ "loginCreated": "Novo usuário registrado",
+ "loginResetSuccess": "Verifique seu e-mail",
+ "loginUpdateSuccess": "Nova senha definida",
+ "loginLogout": "Sair",
+ "loginLogo": "Logotipo",
+ "loginTotpCode": "Código One-time Password",
+ "loginTotpKey": "Chave One-time Password",
+ "devicesAndState": "Dispositivo e Estado",
+ "deviceSelected": "Dispositivo selecionado",
+ "deviceTitle": "Dispositivos",
+ "devicePrimaryInfo": "Título do dispositivo",
+ "deviceSecondaryInfo": "Detalhes do dispositivo",
+ "deviceIdentifier": "Identificador",
+ "deviceModel": "Modelo",
+ "deviceContact": "Contato",
+ "deviceCategory": "Categoria",
+ "deviceLastUpdate": "Última Atualização",
+ "deviceCommand": "Comando",
+ "deviceFollow": "Seguir",
+ "deviceTotalDistance": "Distância total",
+ "deviceStatus": "Estado",
+ "deviceStatusOnline": "Conectado",
+ "deviceStatusOffline": "Desconectado",
+ "deviceStatusUnknown": "Desconhecido",
+ "deviceRegisterFirst": "Registre seu primeiro dispositivo",
+ "deviceIdentifierHelp": "IMEI, número de serial ou outro ID. Precisa ser um identificador único para os relatórios do dispositivo no servidor.",
+ "deviceShare": "Dispositivo Compartilhado",
+ "groupDialog": "Grupo",
+ "groupParent": "Grupo",
+ "groupNoGroup": "Sem Grupo",
+ "settingsTitle": "Configurações",
+ "settingsUser": "Conta",
+ "settingsGroups": "Grupos",
+ "settingsServer": "Servidor",
+ "settingsUsers": "Usuários",
+ "settingsDistanceUnit": "Unidade de Distância",
+ "settingsAltitudeUnit": "Altitude Unidade",
+ "settingsSpeedUnit": "Unidade de Velocidade",
+ "settingsVolumeUnit": "Unidade de Volume",
+ "settingsTwelveHourFormat": "Formato de 12 Horas",
+ "settingsCoordinateFormat": "Formato de coordenadas",
+ "settingsServerVersion": "Versão do servidor",
+ "settingsAppVersion": "Versão do aplicativo",
+ "settingsConnection": "Conexão",
+ "settingsDarkMode": "Modo Escuro",
+ "settingsTotpEnable": "Habilitar One-time Password",
+ "settingsTotpForce": "Forçar One-time Password",
+ "settingsServiceWorkerUpdateInterval": "Intervalo de atualização do ServiceWorker",
+ "settingsUpdateAvailable": "Existe uma atualização disponível.",
+ "settingsSupport": "Support",
+ "reportTitle": "Relatórios",
+ "reportScheduled": "Agendamento de relatórios",
+ "reportDevice": "Dispositivo",
+ "reportGroup": "Grupo",
+ "reportFrom": "De",
+ "reportTo": "Para",
+ "reportShow": "Mostrar",
+ "reportClear": "Limpar",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Definir tempo",
+ "positionDeviceTime": "Hora do dispositivo",
+ "positionServerTime": "Hora do servidor",
+ "positionValid": "Válido",
+ "positionAccuracy": "Precisão",
+ "positionLatitude": "Latitude",
+ "positionLongitude": "Longitude",
+ "positionAltitude": "Altitude",
+ "positionSpeed": "Velocidade",
+ "positionCourse": "Direção",
+ "positionAddress": "Endereço",
+ "positionProtocol": "Protocolo",
+ "positionDistance": "Distância",
+ "positionRpm": "RPM",
+ "positionFuel": "Combustível",
+ "positionPower": "Potência",
+ "positionBattery": "Bateria",
+ "positionRaw": "Bruto",
+ "positionIndex": "Índice",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Sátelites",
+ "positionSatVisible": "Satélites Visíveis",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Evento",
+ "positionAlarm": "Alarme",
+ "positionStatus": "Estado",
+ "positionOdometer": "Odômetro",
+ "positionServiceOdometer": "Odômetro de Serviço",
+ "positionTripOdometer": "Odômetro de Viagem",
+ "positionHours": "Horas",
+ "positionSteps": "Passos",
+ "positionInput": "Entrada",
+ "positionHeartRate": "Frequência Cardíaca",
+ "positionOutput": "Saída",
+ "positionBatteryLevel": "Nível de Bateria",
+ "positionFuelConsumption": "Consumo de Combustível",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Versão de Firmware",
+ "positionVersionHw": "Versão de Hardware",
+ "positionIgnition": "Ignição",
+ "positionFlags": "Sinais",
+ "positionCharge": "Carga",
+ "positionIp": "IP",
+ "positionArchive": "Arquivar",
+ "positionVin": "VIN",
+ "positionApproximate": "Estimado",
+ "positionThrottle": "Acelerador",
+ "positionMotion": "Movimento",
+ "positionArmed": "Alarme Ativado",
+ "positionAcceleration": "Aceleração",
+ "positionTemp": "Temperatura",
+ "positionDeviceTemp": "Temperatura do Dispositivo",
+ "positionCoolantTemp": "Temperatura do líquido de arrefecimento",
+ "positionOperator": "Operadora",
+ "positionCommand": "Comando",
+ "positionBlocked": "Bloqueado",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Velocidade OBD",
+ "positionObdOdometer": "Odômetro OBD",
+ "positionDrivingTime": "Tempo de direção",
+ "positionDriverUniqueId": "Identificador Único Motorista",
+ "positionCard": "Cartão",
+ "positionImage": "Imagem",
+ "positionVideo": "Video",
+ "positionAudio": "Áudio",
+ "serverTitle": "Configurações do Servidor",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registro",
+ "serverReadonly": "Somente leitura",
+ "serverForceSettings": "Forçar configurações",
+ "serverAnnouncement": "Anúncio",
+ "serverName": "Nome do Servidor",
+ "serverDescription": "Descrição do Servidor",
+ "serverColorPrimary": "Cor Primária",
+ "serverColorSecondary": "Cor Secundária",
+ "serverLogo": "Imagem do Logo",
+ "serverLogoInverted": "Imagem do logo invertida",
+ "serverChangeDisable": "Desabilitar mudança de servidor",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Mapa",
+ "mapActive": "Mapas ativos",
+ "mapOverlay": "Sobreposição de mapa",
+ "mapOverlayCustom": "Sobreposição personalizada",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Nuvens",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitação",
+ "mapOpenWeatherPressure": "OpenWeather Pressão",
+ "mapOpenWeatherWind": "OpenWeather Vento",
+ "mapOpenWeatherTemperature": "OpenWeather Temperatura",
+ "mapLayer": "Camada de Mapa",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Personalizar mapa",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Estrada",
+ "mapGoogleHybrid": "Google Híbrido",
+ "mapGoogleSatellite": "Google Satélite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Mapas API Key",
+ "mapBingRoad": "Bing Mapas Estradas",
+ "mapBingAerial": "Bing Mapas Aéreo",
+ "mapBingHybrid": "Bing Mapas Híbrido",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Mapa Yandex",
+ "mapYandexSat": "Satélite Yandex",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Levantamento de artilharia",
+ "mapMapboxStreets": "Mapbox Ruas",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox ao ar livre",
+ "mapMapboxSatellite": "Mapbox Satélite",
+ "mapMapboxKey": "Mapbox Token de Acesso",
+ "mapMapTilerBasic": "MapTiler Básico",
+ "mapMapTilerHybrid": "MapTiler Híbrido",
+ "mapMapTilerKey": "MapTiler Chave API",
+ "mapLocationIqStreets": "LocationIQ Ruas",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Token de Acesso",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Fluxo de Tráfego",
+ "mapTomTomIncidents": "TomTom Incidentes de Tráfego",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basico",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Fluxo de Tráfego",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polígono",
+ "mapShapeCircle": "Círculo",
+ "mapShapePolyline": "Polilinha",
+ "mapLiveRoutes": "Rotas ao Vivo",
+ "mapDirection": "Exibir direção",
+ "mapCurrentLocation": "Localização atual",
+ "mapPoiLayer": "Camada POI",
+ "mapClustering": "Agrupamento de marcadores",
+ "mapOnSelect": "Mostrar mapa na seleção",
+ "mapDefault": "Mapa padrão",
+ "stateTitle": "Estado",
+ "stateName": "Atributo",
+ "stateValue": "Valor",
+ "commandTitle": "Comando",
+ "commandSend": "Enviar",
+ "commandSent": "Comando enviado",
+ "commandQueued": "Comando na fila",
+ "commandUnit": "Unidade",
+ "commandCustom": "Comando personalizado",
+ "commandDeviceIdentification": "Identificação do dispositivo",
+ "commandPositionSingle": "Relatório avulso",
+ "commandPositionPeriodic": "Atualização Periódica",
+ "commandPositionStop": "Parar Atualização",
+ "commandEngineStop": "Desligar Motor",
+ "commandEngineResume": "Religar Motor",
+ "commandAlarmArm": "Ativar Alarme",
+ "commandAlarmDisarm": "Desativar Alarme",
+ "commandAlarmDismiss": "Ignorar Alarme",
+ "commandSetTimezone": "Definir fuso horário",
+ "commandRequestPhoto": "Pegar foto",
+ "commandPowerOff": "Desligar o Dispositivo",
+ "commandRebootDevice": "Reiniciar dispositivo",
+ "commandFactoryReset": "Restauração de fábrica",
+ "commandSendSms": "Enviar SMS",
+ "commandSendUssd": "Enviar USSD",
+ "commandSosNumber": "Definir numero SOS",
+ "commandSilenceTime": "Definir Tempo no Silencioso",
+ "commandSetPhonebook": "Definir lista telefônica",
+ "commandVoiceMessage": "Mensagem de voz",
+ "commandOutputControl": "Controle de saída",
+ "commandVoiceMonitoring": "Monitoramento de Voz",
+ "commandSetAgps": "Definir AGPS",
+ "commandSetIndicator": "Definir Indicador",
+ "commandConfiguration": "Configuração",
+ "commandGetVersion": "Obter Versão",
+ "commandFirmwareUpdate": "Atualizar Firmware",
+ "commandSetConnection": "Definir Conexão",
+ "commandSetOdometer": "Definir Odômetro",
+ "commandGetModemStatus": "Obter Status do Modem",
+ "commandGetDeviceStatus": "Obter status do dispositivo",
+ "commandSetSpeedLimit": "Definir limite de velocidade",
+ "commandModePowerSaving": "Modo de economia de energia",
+ "commandModeDeepSleep": "Modo de Sono Profundo",
+ "commandAlarmGeofence": "Definir Alarme de Geofence",
+ "commandAlarmBattery": "Definir Alarme de Bateria",
+ "commandAlarmSos": "Definir Alarme SOS",
+ "commandAlarmRemove": "Definir Remoção de Alarme",
+ "commandAlarmClock": "Definir Horário de Alarme",
+ "commandAlarmSpeed": "Definir Velocidade de Alarme",
+ "commandAlarmFall": "Definir Falha de Alarme",
+ "commandAlarmVibration": "Definir Alarme de Vibração",
+ "commandFrequency": "Frequência",
+ "commandTimezone": "Ajuste de Fuso horário",
+ "commandMessage": "Mensagem",
+ "commandRadius": "Raio",
+ "commandEnable": "Habilitar",
+ "commandData": "Data",
+ "commandIndex": "Índice",
+ "commandPhone": "Número de Telefone",
+ "commandServer": "Servidor",
+ "commandPort": "Porta",
+ "eventAll": "Todos Eventos",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status desconhecido",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Dispositivo inativo",
+ "eventQueuedCommandSent": "Comando na fila enviado",
+ "eventDeviceMoving": "Dispositivo movendo",
+ "eventDeviceStopped": "Dispositivo parado",
+ "eventDeviceOverspeed": "Excedido o limite de velocidade",
+ "eventDeviceFuelDrop": "Queda de combustível",
+ "eventDeviceFuelIncrease": "Acréscimo de combustível",
+ "eventCommandResult": "Resultado do comando",
+ "eventGeofenceEnter": "Entrada na cerca virtual",
+ "eventGeofenceExit": "Saída da cerca virtual",
+ "eventAlarm": "Alarme",
+ "eventIgnitionOn": "Ignição ligada",
+ "eventIgnitionOff": "Ignição desligada",
+ "eventMaintenance": "Manutenção necessária",
+ "eventTextMessage": "Mensagem de texto recebida",
+ "eventDriverChanged": "Condutor alterado",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Rolar para o último",
+ "eventsSoundEvents": "Som de eventos",
+ "eventsSoundAlarms": "Som de alarmes",
+ "alarmGeneral": "Geral",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibrando",
+ "alarmMovement": "Movendo",
+ "alarmLowspeed": "Velocidade baixa",
+ "alarmOverspeed": "Alta velocidade",
+ "alarmFallDown": "Cair",
+ "alarmLowPower": "Carga Baixa",
+ "alarmLowBattery": "Bateria baixa",
+ "alarmFault": "Falha",
+ "alarmPowerOff": "Alimentação desligada",
+ "alarmPowerOn": "Alimentação ligada",
+ "alarmDoor": "Porta",
+ "alarmLock": "Bloqueado",
+ "alarmUnlock": "Desbloqueado",
+ "alarmGeofence": "Cerca virtual",
+ "alarmGeofenceEnter": "Entrando na cerca virtual",
+ "alarmGeofenceExit": "Saiu da Cerca virtual",
+ "alarmGpsAntennaCut": "Antena de GPS cortada",
+ "alarmAccident": "Acidente",
+ "alarmTow": "Rebocar",
+ "alarmIdle": "Ocioso",
+ "alarmHighRpm": "Alta Rotação",
+ "alarmHardAcceleration": "Aceleração brusca",
+ "alarmHardBraking": "Frenagem brusca",
+ "alarmHardCornering": "Curva Acentuada",
+ "alarmLaneChange": "Mudança de Faixa",
+ "alarmFatigueDriving": "Condutor Cansado",
+ "alarmPowerCut": "Alimentação cortada",
+ "alarmPowerRestored": "Alimentação restaurada",
+ "alarmJamming": "Interferência",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Estacionamento",
+ "alarmBonnet": "Capô",
+ "alarmFootBrake": "Freio de mão",
+ "alarmFuelLeak": "Vazamento de combustível",
+ "alarmTampering": "Manipulando",
+ "alarmRemoving": "Removendo",
+ "notificationType": "Tipo de Notificação",
+ "notificationAlways": "Todos os Dispositivos",
+ "notificationNotificators": "Canais",
+ "notificatorCommand": "Comando",
+ "notificatorWeb": "Web",
+ "notificatorMail": "E-Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Empurrar",
+ "reportReplay": "Replay",
+ "reportCombined": "Combinado",
+ "reportRoute": "Rota",
+ "reportEvents": "Eventos",
+ "reportTrips": "Viagens",
+ "reportStops": "Paradas",
+ "reportSummary": "Resumo",
+ "reportDaily": "Resumo Diário",
+ "reportChart": "Gráfico",
+ "reportConfigure": "Configurar",
+ "reportEventTypes": "Tipos de Eventos",
+ "reportChartType": "Tipo do Gráfico",
+ "reportShowMarkers": "Mostrar Marcadores",
+ "reportExport": "Exportar",
+ "reportEmail": "Relatório de E-mail",
+ "reportSchedule": "Agenda",
+ "reportPeriod": "Período",
+ "reportCustom": "Personalizadas",
+ "reportToday": "Hoje",
+ "reportYesterday": "Ontem",
+ "reportThisWeek": "Esta Semana",
+ "reportPreviousWeek": "Semana Anterior",
+ "reportThisMonth": "Este Mês",
+ "reportPreviousMonth": "Mês Anterior",
+ "reportDeviceName": "Nome do Dispositivo",
+ "reportAverageSpeed": "Velocidade Média",
+ "reportMaximumSpeed": "Velocidade Máxima",
+ "reportEngineHours": "Horas ligado",
+ "reportDuration": "Duração",
+ "reportStartDate": "Data de Início",
+ "reportStartTime": "Hora inicial",
+ "reportStartAddress": "Endereço inicial",
+ "reportEndTime": "Hora final",
+ "reportEndAddress": "Endereço final",
+ "reportSpentFuel": "Gasto de Combustível",
+ "reportStartOdometer": "Início do odômetro",
+ "reportEndOdometer": "Fim do odômetro",
+ "statisticsTitle": "Estatísticas",
+ "statisticsCaptureTime": "Tempo de Captura",
+ "statisticsActiveUsers": "Usuários ativos",
+ "statisticsActiveDevices": "Dispositivos ativos",
+ "statisticsRequests": "Pedidos",
+ "statisticsMessagesReceived": "Mensagens Recebidas",
+ "statisticsMessagesStored": "Mensagens armazenadas",
+ "statisticsGeocoder": "Solicitações de Geocódigo",
+ "statisticsGeolocation": "Solicitações de Geolocalização",
+ "categoryArrow": "Seta",
+ "categoryDefault": "Padrão",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicicleta",
+ "categoryBoat": "Barco",
+ "categoryBus": "Ônibus",
+ "categoryCar": "Carro",
+ "categoryCamper": "Campista",
+ "categoryCrane": "Guindaste",
+ "categoryHelicopter": "Helicóptero",
+ "categoryMotorcycle": "Motocicleta",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Pessoa",
+ "categoryPickup": "Pick-up",
+ "categoryPlane": "Avião",
+ "categoryShip": "Navio",
+ "categoryTractor": "Trator",
+ "categoryTrain": "Trem",
+ "categoryTram": "Bonde",
+ "categoryTrolleybus": "Ônibus Elétrico",
+ "categoryTruck": "Caminhão",
+ "categoryVan": "Van",
+ "categoryScooter": "Patinete Elétrico",
+ "maintenanceStart": "Começar",
+ "maintenancePeriod": "Período"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ro.json b/legacy/web/l10n/ro.json
new file mode 100644
index 00000000..84367c5b
--- /dev/null
+++ b/legacy/web/l10n/ro.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Se încarcă...",
+ "sharedHide": "Ascunde",
+ "sharedSave": "Salvează",
+ "sharedUpload": "Încarcă",
+ "sharedSet": "Configurare",
+ "sharedCancel": "Anulează",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Adaugă",
+ "sharedEdit": "Modifică",
+ "sharedRemove": "Elimină",
+ "sharedRemoveConfirm": "Ștergeți obiectul?",
+ "sharedNoData": "Fără date",
+ "sharedSubject": "Subject",
+ "sharedYes": "Da",
+ "sharedNo": "Nu",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Oră",
+ "sharedMinute": "Minut",
+ "sharedSecond": "Secundă",
+ "sharedDays": "zile",
+ "sharedHours": "ore",
+ "sharedMinutes": "minute",
+ "sharedDecimalDegrees": "Grade Zecimale",
+ "sharedDegreesDecimalMinutes": "Grade Zecimale Minute",
+ "sharedDegreesMinutesSeconds": "Grade minute secunde",
+ "sharedName": "Nume",
+ "sharedDescription": "Descriere",
+ "sharedSearch": "Căutare",
+ "sharedIconScale": "Scală pentru Iconiță",
+ "sharedGeofence": "Perimetru Restricționat",
+ "sharedGeofences": "Perimetre Restricționate",
+ "sharedCreateGeofence": "Crează Perimetru Restricționat",
+ "sharedNotifications": "Notificări",
+ "sharedNotification": "Notificare",
+ "sharedAttributes": "Atribute",
+ "sharedAttribute": "Atribut",
+ "sharedDrivers": "Șoferi",
+ "sharedDriver": "Șofer",
+ "sharedArea": "Suprafață",
+ "sharedSound": "Sunet Notificare",
+ "sharedType": "Tip",
+ "sharedDistance": "Distanţa",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Litru",
+ "sharedImpGallon": "Galon Imperial",
+ "sharedUsGallon": "Galon US",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Obține Starea Hărții",
+ "sharedComputedAttribute": "Atribut Calculat",
+ "sharedComputedAttributes": "Atribute Calculate",
+ "sharedCheckComputedAttribute": "Verifică Atributul Calculat",
+ "sharedExpression": "Formulă",
+ "sharedDevice": "Dispozitiv",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Trimite Notificare de Test",
+ "sharedTestNotificators": "Canale de Test",
+ "sharedTestExpression": "Formulă de Test",
+ "sharedCalendar": "Calendar",
+ "sharedCalendars": "Calendare",
+ "sharedFile": "Fișier",
+ "sharedSearchDevices": "Caută Echipamente",
+ "sharedSortBy": "Sortat După",
+ "sharedFilterMap": "Filtru pe Hartă",
+ "sharedSelectFile": "Selectează Fișier",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Obligatorii",
+ "sharedPreferences": "Preferințe",
+ "sharedPermissions": "Permisiuni",
+ "sharedConnections": "Conexiuni",
+ "sharedExtra": "Suplimentar",
+ "sharedPrimary": "Primar",
+ "sharedSecondary": "Secundar",
+ "sharedTypeString": "Șir",
+ "sharedTypeNumber": "Număr",
+ "sharedTypeBoolean": "Logic",
+ "sharedTimezone": "Fus orar",
+ "sharedInfoTitle": "Informații",
+ "sharedSavedCommand": "Comandă Salvată",
+ "sharedSavedCommands": "Comenzi Salvate",
+ "sharedNew": "Nou...",
+ "sharedShowAddress": "Afișează Adresa",
+ "sharedShowDetails": "Mai Multe Detalii",
+ "sharedDisabled": "Dezactivat",
+ "sharedMaintenance": "Întreținere",
+ "sharedDeviceAccumulators": "Acumulatori",
+ "sharedAlarms": "Alarme",
+ "sharedLocation": "Locație",
+ "sharedImport": "Import",
+ "sharedColumns": "Coloane",
+ "sharedDropzoneText": "Drag and drop un fișier aici ori click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simplu",
+ "calendarRecurrence": "Recurent",
+ "calendarOnce": "O singură dată",
+ "calendarDaily": "Zilnic",
+ "calendarWeekly": "Săptămânal",
+ "calendarMonthly": "Lunar",
+ "calendarDays": "Zile",
+ "calendarSunday": "Duminică",
+ "calendarMonday": "Luni",
+ "calendarTuesday": "Marți",
+ "calendarWednesday": "Miercuri",
+ "calendarThursday": "Joi",
+ "calendarFriday": "Vineri",
+ "calendarSaturday": "Sâmbătă",
+ "attributeShowGeofences": "Afișează Perimetre Restricționate",
+ "attributeSpeedLimit": "Limita de viteza",
+ "attributeFuelDropThreshold": "Prag de Cădere a Combustibilului",
+ "attributeFuelIncreaseThreshold": "Prag de Creștere a Combustibilului",
+ "attributePolylineDistance": "Distanță Polilinie",
+ "attributeReportIgnoreOdometer": "Raport: Ignoră Kilometraj",
+ "attributeWebReportColor": "Web: Culoare Raport",
+ "attributeDevicePassword": "Parolă Dispozitiv",
+ "attributeDeviceImage": "Imagine Dispozitiv",
+ "attributeDeviceInactivityStart": "Dată Start Dispozitiv Inactiv",
+ "attributeDeviceInactivityPeriod": "Perioadă Dispozitiv Inactiv",
+ "attributeProcessingCopyAttributes": "Procesare: Copiază Atribute",
+ "attributeColor": "Culoare",
+ "attributeWebLiveRouteLength": "Web: Lungime Traseu în Timp Real",
+ "attributeWebSelectZoom": "Web: Zoom la Selecție",
+ "attributeWebMaxZoom": "Web: Zoom Maxim",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Cheie Utilizator Pushover",
+ "attributePushoverDeviceNames": "Nume Dispozitiv Pushover",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "attributeMailSmtpStarttlsEnable": "Mail: Activeaza SMTP STARTTLS ",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS Obligatoriu",
+ "attributeMailSmtpSslEnable": "Mail: Activează SMTP SSL",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Mail: Protocol SMTP SSL",
+ "attributeMailSmtpFrom": "Mail: SMTP Expeditor",
+ "attributeMailSmtpAuth": "Mail: Activează SMTP Auth",
+ "attributeMailSmtpUsername": "Mail: Utilizator SMTP",
+ "attributeMailSmtpPassword": "Mail: Parolă SMTP",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Dezactivare Atribute",
+ "attributeUiDisableGroups": "UI: Dezactivare Grupuri",
+ "attributeUiDisableEvents": "UI: Dezactivare Evenimente",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Dezactivare Șoferi",
+ "attributeUiDisableComputedAttributes": "UI: Dezactivare Atribute Calculate",
+ "attributeUiDisableCalendars": "UI: Dezactivare Calendar",
+ "attributeUiDisableMaintenance": "UI: Dezactivare Întreținere",
+ "attributeUiHidePositionAttributes": "UI: Ascunde Atributele de Poziționare",
+ "attributeUiDisableLoginLanguage": "UI: Dezactivare Limbă Autentificare",
+ "attributeNotificationTokens": "Token-uri Notificări",
+ "attributePopupInfo": "Informații Popup",
+ "errorTitle": "Eroare",
+ "errorGeneral": "Parametri invalizi sau încălcare a restricțiilor",
+ "errorConnection": "Eroare de conectare",
+ "errorSocket": "Eroare conectare web socket",
+ "errorZero": "Nu poate fi zero",
+ "userEmail": "Email",
+ "userPassword": "Parolă",
+ "userAdmin": "Admin",
+ "userRemember": "Ţine minte",
+ "userExpirationTime": "Expirare",
+ "userDeviceLimit": "Limită Dispozitiv",
+ "userUserLimit": "Limită Utilizator",
+ "userDeviceReadonly": "Dispozitiv Doar pentru Citire",
+ "userLimitCommands": "Limită Comenzi",
+ "userDisableReports": "Dezactivare Rapoarte",
+ "userFixedEmail": "Schimbare Adresă Email Interzisă",
+ "userToken": "Token",
+ "userDeleteAccount": "Șterge Cont",
+ "userTemporary": "Temporary",
+ "loginTitle": "Autentificare",
+ "loginLanguage": "Limbă",
+ "loginReset": "Reconfigurare Parolă",
+ "loginRegister": "Înregistrare",
+ "loginLogin": "Autentificare",
+ "loginOpenId": "Autentificare cu OpenID",
+ "loginFailed": "Email sau parolă incorectă",
+ "loginCreated": "Un nou utilizator a fost înregistrat",
+ "loginResetSuccess": "Verifică email",
+ "loginUpdateSuccess": "Noua parolă a fost configurată",
+ "loginLogout": "Deconectare",
+ "loginLogo": "Logo",
+ "loginTotpCode": "Cod Parolă One-time",
+ "loginTotpKey": "Cheie Parolă One-time",
+ "devicesAndState": "Dispozitive și Stare",
+ "deviceSelected": "Dispozitiv Selectat",
+ "deviceTitle": "Dispozitive",
+ "devicePrimaryInfo": "Titlu Dispozitiv",
+ "deviceSecondaryInfo": "Detaliu Dispozitiv",
+ "deviceIdentifier": "Identificator",
+ "deviceModel": "Model",
+ "deviceContact": "Contact",
+ "deviceCategory": "Categorie",
+ "deviceLastUpdate": "Ultima actualizare",
+ "deviceCommand": "Comandă",
+ "deviceFollow": "Urmărește",
+ "deviceTotalDistance": "Distanță Totală",
+ "deviceStatus": "Stare",
+ "deviceStatusOnline": "Conectat",
+ "deviceStatusOffline": "Deconectat",
+ "deviceStatusUnknown": "Necunoscut",
+ "deviceRegisterFirst": "Inregistrează primul tău dispozitiv",
+ "deviceIdentifierHelp": "IMEI, serial number ori alt ID. Trebuie sa coincidă cu identificatorul dispozitivului raportat la server.",
+ "deviceShare": "Partajează Dispozitiv",
+ "groupDialog": "Grup",
+ "groupParent": "Grup",
+ "groupNoGroup": "Fără Grup",
+ "settingsTitle": "Configurări",
+ "settingsUser": "Cont",
+ "settingsGroups": "Grupuri",
+ "settingsServer": "Server",
+ "settingsUsers": "Utilizatori",
+ "settingsDistanceUnit": "Unitatea de Măsură Distanță",
+ "settingsAltitudeUnit": "Unitate de Măsură Altitudine",
+ "settingsSpeedUnit": "Unitate de Măsură Viteză",
+ "settingsVolumeUnit": "Unitate de Măsură Volum",
+ "settingsTwelveHourFormat": "Format 12-ore",
+ "settingsCoordinateFormat": "Format Coordonate",
+ "settingsServerVersion": "Versiune Server",
+ "settingsAppVersion": "Versiune Aplicație",
+ "settingsConnection": "Conexiune",
+ "settingsDarkMode": "Mod Întunecat",
+ "settingsTotpEnable": "Activează Parolă One-time",
+ "settingsTotpForce": "Forțează Parolă One-time",
+ "settingsServiceWorkerUpdateInterval": "Interval Actualizare ServiceWorker",
+ "settingsUpdateAvailable": "Există o actualizare disponibilă.",
+ "settingsSupport": "Support",
+ "reportTitle": "Rapoarte",
+ "reportScheduled": "Rapoarte Programate",
+ "reportDevice": "Dispozitiv",
+ "reportGroup": "Grup",
+ "reportFrom": "De la ",
+ "reportTo": "Până la",
+ "reportShow": "Afișează",
+ "reportClear": "Sterge",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Ora Fix-ului",
+ "positionDeviceTime": "Timpul Dispozitivului",
+ "positionServerTime": "Timpul Serverului",
+ "positionValid": "Valabil",
+ "positionAccuracy": "Precizie",
+ "positionLatitude": "Latitudine",
+ "positionLongitude": "Longitudine",
+ "positionAltitude": "Altitudine",
+ "positionSpeed": "Viteză",
+ "positionCourse": "Curs",
+ "positionAddress": "Adresă",
+ "positionProtocol": "Protocol",
+ "positionDistance": "Distanța",
+ "positionRpm": "Turatia",
+ "positionFuel": "Nivel combustibil",
+ "positionPower": "Alimentare",
+ "positionBattery": "Baterie",
+ "positionRaw": "Brut",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP Eroare pe orizontala",
+ "positionVdop": "VDOP Eroare pe verticala",
+ "positionPdop": "PDOP Eroarea pozitiei",
+ "positionSat": "Sateliti",
+ "positionSatVisible": "Sateliti Vizibili",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Migrare",
+ "positionEvent": "Eveniment",
+ "positionAlarm": "Alarma",
+ "positionStatus": "Stare",
+ "positionOdometer": "Kilometraj",
+ "positionServiceOdometer": "Kilometraj Service",
+ "positionTripOdometer": "Kilometraj Călătorie",
+ "positionHours": "Ore",
+ "positionSteps": "Pasi",
+ "positionInput": "Intrare",
+ "positionHeartRate": "Ritmul Cardiac",
+ "positionOutput": "Iesire",
+ "positionBatteryLevel": "Nivel baterie",
+ "positionFuelConsumption": "Consum combustibil",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Vesiune firmware",
+ "positionVersionHw": "Versiune hardware",
+ "positionIgnition": "Contact motor",
+ "positionFlags": "Marcaj",
+ "positionCharge": "Incarca",
+ "positionIp": "Adresa IP",
+ "positionArchive": "Arhiva",
+ "positionVin": "Numar identificare vehicul (VIN)",
+ "positionApproximate": "Aproximeaza",
+ "positionThrottle": "Pedala acceleratie",
+ "positionMotion": "Miscare",
+ "positionArmed": "Armat",
+ "positionAcceleration": "Acceleratie",
+ "positionTemp": "Temperatură",
+ "positionDeviceTemp": "Temperatura Dispozitivului",
+ "positionCoolantTemp": "Temperatuă Lichid de Răcire",
+ "positionOperator": "Operator",
+ "positionCommand": "Comenzi",
+ "positionBlocked": "Blocat",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Viteza OBD",
+ "positionObdOdometer": "Kilometraj OBD",
+ "positionDrivingTime": "Timp de Conducere",
+ "positionDriverUniqueId": "Identificator Unic Șofer",
+ "positionCard": "Card",
+ "positionImage": "Imagine",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Configurări Server",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Înregistrare",
+ "serverReadonly": "Doar pentru Citire",
+ "serverForceSettings": "Forțează Configurări",
+ "serverAnnouncement": "Anunț",
+ "serverName": "Nume Server",
+ "serverDescription": "Descriere Server",
+ "serverColorPrimary": "Culoare Primară",
+ "serverColorSecondary": "Culoare Secundară",
+ "serverLogo": "Imagine Logo",
+ "serverLogoInverted": "Imagine Logo Inversată",
+ "serverChangeDisable": "Dezactivează Schimbarea Serverului",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Hartă",
+ "mapActive": "Hărți Active",
+ "mapOverlay": "Suprapunere Hartă",
+ "mapOverlayCustom": "Suprapunere Personalizată",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "Cheie API OpenWeather",
+ "mapOpenWeatherClouds": "Nori OpenWeather",
+ "mapOpenWeatherPrecipitation": "Precipitații OpenWeather",
+ "mapOpenWeatherPressure": "Presiune OpenWeather",
+ "mapOpenWeatherWind": "Vânt OpenWeather",
+ "mapOpenWeatherTemperature": "Temperatură OpenWeather",
+ "mapLayer": "Strat Hartă",
+ "mapCustom": "Personalizat (XYX)",
+ "mapCustomArcgis": "Personalizat (ArcGIS)",
+ "mapCustomLabel": "Hartă personalizată",
+ "mapCarto": "Harta Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Cheie Bing Maps",
+ "mapBingRoad": "Bing Hartă Drumuri",
+ "mapBingAerial": "Bing Hartă Aeriană",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Harta Yandex",
+ "mapYandexSat": "Satelit Yandex",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Token Acces MapBox",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "Cheie API MapTiler",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "Token Acces LocationIQ",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "Cheie API TomTom",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "API Key Here",
+ "mapShapePolygon": "Poligon",
+ "mapShapeCircle": "Cerc",
+ "mapShapePolyline": "Polilinie",
+ "mapLiveRoutes": "Trasee în Timp Real",
+ "mapDirection": "Afișează Direcție",
+ "mapCurrentLocation": "Locația Curentă",
+ "mapPoiLayer": "POI ",
+ "mapClustering": "Clustere de Marcatori",
+ "mapOnSelect": "Afișează Harta la Selectare",
+ "mapDefault": "Hartă Implicită",
+ "stateTitle": "Stare",
+ "stateName": "Atribut",
+ "stateValue": "Valoare",
+ "commandTitle": "Comandă",
+ "commandSend": "Trimite",
+ "commandSent": "Comanda trimisa",
+ "commandQueued": "Comanda adaugata in coada",
+ "commandUnit": "Unitate",
+ "commandCustom": "Comandă personalizată",
+ "commandDeviceIdentification": "Identificare Dispozitiv",
+ "commandPositionSingle": "Raportarea unică",
+ "commandPositionPeriodic": "Raportarea Periodică",
+ "commandPositionStop": "Oprire Raportare",
+ "commandEngineStop": "Blocare Motor",
+ "commandEngineResume": "Deblocare Motor",
+ "commandAlarmArm": "Activare Alarmă",
+ "commandAlarmDisarm": "Dezactivare alarmă",
+ "commandAlarmDismiss": "Închide Alarmă",
+ "commandSetTimezone": "Configurare Fus Orar",
+ "commandRequestPhoto": "Solicitare Foto",
+ "commandPowerOff": "Oprire Dispozitiv",
+ "commandRebootDevice": "Repornire Dispozitiv",
+ "commandFactoryReset": "Reconfigurare la Parametrii de Fabrică",
+ "commandSendSms": "Trimite SMS",
+ "commandSendUssd": "Trimite USSD",
+ "commandSosNumber": "Configurare Număr SOS",
+ "commandSilenceTime": "Configurare Timp Silențios",
+ "commandSetPhonebook": "Configurare Agendă Telefonică",
+ "commandVoiceMessage": "Mesaj Vocal",
+ "commandOutputControl": "Controlul de ieșire",
+ "commandVoiceMonitoring": "Monitorizare Audio",
+ "commandSetAgps": "Configurare AGPS",
+ "commandSetIndicator": "Configurare Indicator",
+ "commandConfiguration": "Configurare",
+ "commandGetVersion": "Obține Versiunea",
+ "commandFirmwareUpdate": "Actualizare Firmware",
+ "commandSetConnection": "Configurare Conexiune",
+ "commandSetOdometer": "Configurare Kilometraj",
+ "commandGetModemStatus": "Obține Starea Modemului",
+ "commandGetDeviceStatus": "Obține Starea Dispozitivului",
+ "commandSetSpeedLimit": "Configurare Limită de Viteză",
+ "commandModePowerSaving": "Mod Salvare Energie",
+ "commandModeDeepSleep": "Mod Somn Adânc",
+ "commandAlarmGeofence": "Configurare Alarmă Perimetru Restricționat",
+ "commandAlarmBattery": "Configurare Alarmă Baterie",
+ "commandAlarmSos": "Configurare Alarmă SOS",
+ "commandAlarmRemove": "Configurare Eliminare Alarmă",
+ "commandAlarmClock": "Configurare Alarmă Ceas",
+ "commandAlarmSpeed": "Configurare Alarmă Viteză",
+ "commandAlarmFall": "Configurare Alarmă pentru Cădere",
+ "commandAlarmVibration": "Configurare Alarmă Vibrație",
+ "commandFrequency": "Frecvenţă",
+ "commandTimezone": "Diferență Fus Orar",
+ "commandMessage": "Mesaj",
+ "commandRadius": "Rază",
+ "commandEnable": "Activează",
+ "commandData": "Informații",
+ "commandIndex": "Index",
+ "commandPhone": "Telefon",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Toate Evenimentele",
+ "eventDeviceOnline": "Stare pornit",
+ "eventDeviceUnknown": "Stare necunoscută",
+ "eventDeviceOffline": "Stare oprit",
+ "eventDeviceInactive": "Dispozitiv inactiv",
+ "eventQueuedCommandSent": "Comandă Pusă la Coadă",
+ "eventDeviceMoving": "Dispozitiv in mișcare",
+ "eventDeviceStopped": "Dispozitiv oprit",
+ "eventDeviceOverspeed": "Viteza maxima depasita",
+ "eventDeviceFuelDrop": "Scadere nivel carburant",
+ "eventDeviceFuelIncrease": "Creștere a Combustibilului",
+ "eventCommandResult": "Rezultat comandă",
+ "eventGeofenceEnter": "Intare perimetru restricționat",
+ "eventGeofenceExit": "Ieșire perimetru restricționat",
+ "eventAlarm": "Alarma",
+ "eventIgnitionOn": "Contact pornit",
+ "eventIgnitionOff": "Contact oprit",
+ "eventMaintenance": "Necesită întreținere",
+ "eventTextMessage": "Mesaj text recepționat",
+ "eventDriverChanged": "Șofer schimbat",
+ "eventMedia": "Mediu",
+ "eventsScrollToLast": "Deruleaza la sfarsit",
+ "eventsSoundEvents": "Sunet Evenimente",
+ "eventsSoundAlarms": "Sunet Alarme",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibratii",
+ "alarmMovement": "Miscare",
+ "alarmLowspeed": "Viteza redusa",
+ "alarmOverspeed": "Viteza depasita",
+ "alarmFallDown": "Reducere",
+ "alarmLowPower": "Putere redusa",
+ "alarmLowBattery": "Nivel scazut baterie",
+ "alarmFault": "Eroare",
+ "alarmPowerOff": "Pornit",
+ "alarmPowerOn": "Oprit",
+ "alarmDoor": "Usa",
+ "alarmLock": "Blocare",
+ "alarmUnlock": "Deblocare",
+ "alarmGeofence": "Perimetru Restricționat",
+ "alarmGeofenceEnter": "Intrare Perimetru Restricționat",
+ "alarmGeofenceExit": "Ieșire Perimetru Restricționat",
+ "alarmGpsAntennaCut": "Antena GPS taiata",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tractare",
+ "alarmIdle": "In asteptare",
+ "alarmHighRpm": "Turatie ridicata",
+ "alarmHardAcceleration": "Accelerare Puternica",
+ "alarmHardBraking": "Frana de Urgenta",
+ "alarmHardCornering": "Viraj Brusc",
+ "alarmLaneChange": "Schimbare Banda",
+ "alarmFatigueDriving": "Condus in stare de oboseala",
+ "alarmPowerCut": "Taiere Alimentare",
+ "alarmPowerRestored": "Alimentare restabilita",
+ "alarmJamming": "Bruiaj",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Parcare",
+ "alarmBonnet": "Capota",
+ "alarmFootBrake": "Frana de serviciu",
+ "alarmFuelLeak": "Pierdere combustibil",
+ "alarmTampering": "Acces neautorizat",
+ "alarmRemoving": "Indepartare",
+ "notificationType": "Tip de Notificare",
+ "notificationAlways": "Toate Dispozitivele",
+ "notificationNotificators": "Canale",
+ "notificatorCommand": "Comandă",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Reluare",
+ "reportCombined": "Combinat",
+ "reportRoute": "Trasee",
+ "reportEvents": "Evenimente",
+ "reportTrips": "Călătorii",
+ "reportStops": "Opriri",
+ "reportSummary": "Sumar",
+ "reportDaily": "Sumar Zilnic",
+ "reportChart": "Grafic",
+ "reportConfigure": "Configureaza",
+ "reportEventTypes": "Tipuri Evenimente",
+ "reportChartType": "Tip Grafic",
+ "reportShowMarkers": "Afișează Marcatori",
+ "reportExport": "Exporta",
+ "reportEmail": "Raport Email",
+ "reportSchedule": "Program",
+ "reportPeriod": "Perioada",
+ "reportCustom": "Personalizat",
+ "reportToday": "Astăzi",
+ "reportYesterday": "Ieri",
+ "reportThisWeek": "Săptămâna Curentă",
+ "reportPreviousWeek": "Săptămâna Precedentă",
+ "reportThisMonth": "Luna Aceasta",
+ "reportPreviousMonth": "Luna Precedentă",
+ "reportDeviceName": "Nume Dispozitiv",
+ "reportAverageSpeed": "Viteza medie",
+ "reportMaximumSpeed": "Viteză Maximă",
+ "reportEngineHours": "Ore motor",
+ "reportDuration": "Durata",
+ "reportStartDate": "Data Start",
+ "reportStartTime": "Oră Start",
+ "reportStartAddress": "Adresa de start",
+ "reportEndTime": "Oră Sfârșit",
+ "reportEndAddress": "Adresa Sfârșit",
+ "reportSpentFuel": "Combustibil consumat",
+ "reportStartOdometer": "Kilometraj Start",
+ "reportEndOdometer": "Kilomteraj Sfârșit",
+ "statisticsTitle": "Statistici",
+ "statisticsCaptureTime": "Timpul ",
+ "statisticsActiveUsers": "Utilizatori Activi",
+ "statisticsActiveDevices": "Dispozitive Active",
+ "statisticsRequests": "Solicitări",
+ "statisticsMessagesReceived": "Mesaje Primite",
+ "statisticsMessagesStored": "Mesaje Salvate",
+ "statisticsGeocoder": "Solicitări de Geocodare",
+ "statisticsGeolocation": "Solicitări de Geolocare",
+ "categoryArrow": "Sageata",
+ "categoryDefault": "Implicit",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicicleta",
+ "categoryBoat": "Barca",
+ "categoryBus": "Autobuz",
+ "categoryCar": "Masina",
+ "categoryCamper": "Rulotă",
+ "categoryCrane": "Macara",
+ "categoryHelicopter": "Elicopter",
+ "categoryMotorcycle": "Motocicleta",
+ "categoryOffroad": "Teren Accidentat",
+ "categoryPerson": "Persoana",
+ "categoryPickup": "Papuc",
+ "categoryPlane": "Avion",
+ "categoryShip": "Nava",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Tren",
+ "categoryTram": "Tramvai",
+ "categoryTrolleybus": "Trolebuz",
+ "categoryTruck": "Camion",
+ "categoryVan": "Duba",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Perioada"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ru.json b/legacy/web/l10n/ru.json
new file mode 100644
index 00000000..4d70757d
--- /dev/null
+++ b/legacy/web/l10n/ru.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Загрузка...",
+ "sharedHide": "Скрыть",
+ "sharedSave": "Сохранить",
+ "sharedUpload": "Upload",
+ "sharedSet": "Установить",
+ "sharedCancel": "Отмена",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Добавить",
+ "sharedEdit": "Редактировать",
+ "sharedRemove": "Удалить",
+ "sharedRemoveConfirm": "Удалить элемент?",
+ "sharedNoData": "Нет данных",
+ "sharedSubject": "Subject",
+ "sharedYes": "Да",
+ "sharedNo": "Нет",
+ "sharedKm": "км",
+ "sharedMi": "мили",
+ "sharedNmi": "м.мили",
+ "sharedMeters": "м",
+ "sharedFeet": "фт",
+ "sharedKn": "уз",
+ "sharedKmh": "км/ч",
+ "sharedMph": "миль/ч",
+ "sharedHour": "Часы",
+ "sharedMinute": "Минуты",
+ "sharedSecond": "Секунды",
+ "sharedDays": "дней",
+ "sharedHours": "часов",
+ "sharedMinutes": "минут",
+ "sharedDecimalDegrees": "Десятичные градусы",
+ "sharedDegreesDecimalMinutes": "Градусы Десятичные минуты",
+ "sharedDegreesMinutesSeconds": "Градусы Минуты Секунды",
+ "sharedName": "Имя",
+ "sharedDescription": "Описание",
+ "sharedSearch": "Поиск",
+ "sharedIconScale": "Иконка масштаба",
+ "sharedGeofence": "Геозона",
+ "sharedGeofences": "Геозоны",
+ "sharedCreateGeofence": "Создать геозону",
+ "sharedNotifications": "Уведомления",
+ "sharedNotification": "Уведомление",
+ "sharedAttributes": "Атрибуты",
+ "sharedAttribute": "Атрибут",
+ "sharedDrivers": "Водители",
+ "sharedDriver": "Водитель",
+ "sharedArea": "Область",
+ "sharedSound": "Звуковое уведомление",
+ "sharedType": "Тип",
+ "sharedDistance": "Расстояние",
+ "sharedHourAbbreviation": "ч",
+ "sharedMinuteAbbreviation": "м",
+ "sharedSecondAbbreviation": "с",
+ "sharedVoltAbbreviation": "В",
+ "sharedLiterAbbreviation": "л",
+ "sharedGallonAbbreviation": "галлон",
+ "sharedLiter": "Литр",
+ "sharedImpGallon": "Имп. галлон",
+ "sharedUsGallon": "Галлон США",
+ "sharedLiterPerHourAbbreviation": "л/ч",
+ "sharedGetMapState": "Получить состояние карты",
+ "sharedComputedAttribute": "Вычисляемый атрибут",
+ "sharedComputedAttributes": "Вычисляемые атрибуты",
+ "sharedCheckComputedAttribute": "Проверить вычисляемый атрибут",
+ "sharedExpression": "Выражение",
+ "sharedDevice": "Устройство",
+ "sharedTest": "Тест",
+ "sharedTestNotification": "Отправить тестовое уведомление",
+ "sharedTestNotificators": "Тестовый канал",
+ "sharedTestExpression": "Тестовое выражение",
+ "sharedCalendar": "Календарь",
+ "sharedCalendars": "Календари",
+ "sharedFile": "Файл",
+ "sharedSearchDevices": "Поиск устройств",
+ "sharedSortBy": "Сортировать по",
+ "sharedFilterMap": "Фильтр на карте",
+ "sharedSelectFile": "Выбрать файл",
+ "sharedPhone": "Телефон",
+ "sharedRequired": "Обязательные",
+ "sharedPreferences": "Настройки",
+ "sharedPermissions": "Разрешения",
+ "sharedConnections": "Соединения",
+ "sharedExtra": "Экстра",
+ "sharedPrimary": "Первичный",
+ "sharedSecondary": "Вторичный",
+ "sharedTypeString": "Строка",
+ "sharedTypeNumber": "Число",
+ "sharedTypeBoolean": "Логическое значение",
+ "sharedTimezone": "Часовой пояс",
+ "sharedInfoTitle": "Инфо",
+ "sharedSavedCommand": "Сохраненная команда",
+ "sharedSavedCommands": "Сохраненные команды",
+ "sharedNew": "Новый...",
+ "sharedShowAddress": "Показать адрес",
+ "sharedShowDetails": "Подробнее",
+ "sharedDisabled": "Отключен",
+ "sharedMaintenance": "Обслуживание",
+ "sharedDeviceAccumulators": "Аккумуляторы",
+ "sharedAlarms": "Тревоги",
+ "sharedLocation": "Расположение",
+ "sharedImport": "Импортировать",
+ "sharedColumns": "Колонка",
+ "sharedDropzoneText": "Перетащите файл сюда или нажмите",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Простой",
+ "calendarRecurrence": "Повторение",
+ "calendarOnce": "Однократно",
+ "calendarDaily": "Ежедневно",
+ "calendarWeekly": "Еженедельно",
+ "calendarMonthly": "Ежемесячно",
+ "calendarDays": "Дни",
+ "calendarSunday": "Воскресенье",
+ "calendarMonday": "Понедельник",
+ "calendarTuesday": "Вторник",
+ "calendarWednesday": "Среда",
+ "calendarThursday": "Четверг",
+ "calendarFriday": "Пятница",
+ "calendarSaturday": "Суббота",
+ "attributeShowGeofences": "Показать геозоны",
+ "attributeSpeedLimit": "Ограничение скорости",
+ "attributeFuelDropThreshold": "Порог снижения расхода топлива",
+ "attributeFuelIncreaseThreshold": "Порог увеличения расхода топлива",
+ "attributePolylineDistance": "Расстояние от линии",
+ "attributeReportIgnoreOdometer": "Отчет: Игнорировать одометер",
+ "attributeWebReportColor": "Веб: Цвет отчета",
+ "attributeDevicePassword": "Пароль устройства",
+ "attributeDeviceImage": "Картинка устройства",
+ "attributeDeviceInactivityStart": "Начало бездействия устройства",
+ "attributeDeviceInactivityPeriod": "Период бездействия устройства",
+ "attributeProcessingCopyAttributes": "Обработка: Копирование атрибутов",
+ "attributeColor": "Цвет",
+ "attributeWebLiveRouteLength": "Веб: Длина онлайн маршрута",
+ "attributeWebSelectZoom": "Веб: Увеличение при выборе",
+ "attributeWebMaxZoom": "Веб: Максимальное увеличение",
+ "attributeTelegramChatId": "ID чата в Телеграмме",
+ "attributePushoverUserKey": "Нажатие пользовательской клавиши",
+ "attributePushoverDeviceNames": "Нажатие имени устройства",
+ "attributeMailSmtpHost": "Почта: SMTP хост",
+ "attributeMailSmtpPort": "Почта: SMTP порт",
+ "attributeMailSmtpStarttlsEnable": "Почта: Включить SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "Почта: Необходим SMTP STARTTLS",
+ "attributeMailSmtpSslEnable": "Почта: Включить SMTP SSL",
+ "attributeMailSmtpSslTrust": "Почта: Доверие SMTP SSL",
+ "attributeMailSmtpSslProtocols": "Почта: Протоколы SMTP SSL",
+ "attributeMailSmtpFrom": "Почта: SMTP отправитель",
+ "attributeMailSmtpAuth": "Почта: Включить SMTP аутентификацию",
+ "attributeMailSmtpUsername": "Почта: SMTP имя пользователя",
+ "attributeMailSmtpPassword": "Почта: SMTP пароль",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Выключить атрибуты",
+ "attributeUiDisableGroups": "UI: Выключить группы",
+ "attributeUiDisableEvents": "UI: Отключить события",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Отключить водителей",
+ "attributeUiDisableComputedAttributes": "UI: Отключить вычисляемые атрибуты",
+ "attributeUiDisableCalendars": "UI: Отключить календари",
+ "attributeUiDisableMaintenance": "UI: Отключить обслуживание",
+ "attributeUiHidePositionAttributes": "UI: Скрывать атрибуты",
+ "attributeUiDisableLoginLanguage": "UI: Отключить выбор языка при входе",
+ "attributeNotificationTokens": "Токены Уведомлений",
+ "attributePopupInfo": "Всплывающая информация",
+ "errorTitle": "Ошибка",
+ "errorGeneral": "Неправильные параметры или нарушение ограничений",
+ "errorConnection": "Ошибка соединения",
+ "errorSocket": "Ошибка web socket соединения",
+ "errorZero": "Не может быть нулевым",
+ "userEmail": "Email",
+ "userPassword": "Пароль",
+ "userAdmin": "Администратор",
+ "userRemember": "Запомнить",
+ "userExpirationTime": "Срок действия",
+ "userDeviceLimit": "Ограничение устройств",
+ "userUserLimit": "Лимит пользователей",
+ "userDeviceReadonly": "Только просмотр устройств",
+ "userLimitCommands": "Ограничение команд",
+ "userDisableReports": "Выключить отчеты",
+ "userFixedEmail": "Не изменять Email",
+ "userToken": "Ключ",
+ "userDeleteAccount": "Удалить аккаунт",
+ "userTemporary": "Temporary",
+ "loginTitle": "Вход",
+ "loginLanguage": "Язык",
+ "loginReset": "Сброс пароля",
+ "loginRegister": "Регистрация",
+ "loginLogin": "Вход",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Неправильный email адрес или пароль",
+ "loginCreated": "Новый пользователь зарегистрирован",
+ "loginResetSuccess": "Проверьте свою электронную почту",
+ "loginUpdateSuccess": "Новый пароль установлен",
+ "loginLogout": "Выход",
+ "loginLogo": "Логотип",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Устройства и состояния",
+ "deviceSelected": "Выбранное устройство",
+ "deviceTitle": "Устройства",
+ "devicePrimaryInfo": "Название устройства",
+ "deviceSecondaryInfo": "Детали устройства",
+ "deviceIdentifier": "Идентификатор",
+ "deviceModel": "Модель",
+ "deviceContact": "Контакт",
+ "deviceCategory": "Категория",
+ "deviceLastUpdate": "Последнее обновление",
+ "deviceCommand": "Команда",
+ "deviceFollow": "Следовать",
+ "deviceTotalDistance": "Общий пробег",
+ "deviceStatus": "Статус",
+ "deviceStatusOnline": "Онлайн",
+ "deviceStatusOffline": "Оффлайн",
+ "deviceStatusUnknown": "Неизвестный",
+ "deviceRegisterFirst": "Добавьте свое первое устройство",
+ "deviceIdentifierHelp": "IMEI, серийный номер или другой идентификатор. Он должен соответствовать идентификатору, который устройство сообщает серверу.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Группа",
+ "groupParent": "Группа",
+ "groupNoGroup": "Без группы",
+ "settingsTitle": "Настройки",
+ "settingsUser": "Аккаунт",
+ "settingsGroups": "Группы",
+ "settingsServer": "Сервер",
+ "settingsUsers": "Пользователи",
+ "settingsDistanceUnit": "Единица расстояния",
+ "settingsAltitudeUnit": "Единица измерения высоты",
+ "settingsSpeedUnit": "Единица скорости",
+ "settingsVolumeUnit": "Единица объема",
+ "settingsTwelveHourFormat": "12-часовой формат",
+ "settingsCoordinateFormat": "Формат координат",
+ "settingsServerVersion": "Версия сервера",
+ "settingsAppVersion": "Версия приложения",
+ "settingsConnection": "Соединения",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Отчеты",
+ "reportScheduled": "Запланированные отчеты",
+ "reportDevice": "Устройство",
+ "reportGroup": "Группа",
+ "reportFrom": "От",
+ "reportTo": "До",
+ "reportShow": "Показать",
+ "reportClear": "Очистить",
+ "linkGoogleMaps": "Карты Google",
+ "linkAppleMaps": "Карты Apple",
+ "linkStreetView": "Просмотр улиц",
+ "positionFixTime": "Время определения",
+ "positionDeviceTime": "Время на устройстве",
+ "positionServerTime": "Время на сервере",
+ "positionValid": "Корректность",
+ "positionAccuracy": "Точность",
+ "positionLatitude": "Широта",
+ "positionLongitude": "Долгота",
+ "positionAltitude": "Высота",
+ "positionSpeed": "Скорость",
+ "positionCourse": "Направление",
+ "positionAddress": "Адрес",
+ "positionProtocol": "Протокол",
+ "positionDistance": "Расстояние",
+ "positionRpm": "Обороты",
+ "positionFuel": "Топливо",
+ "positionPower": "Питание",
+ "positionBattery": "Батарея",
+ "positionRaw": "Сырые данные",
+ "positionIndex": "Индекс",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Спутники",
+ "positionSatVisible": "Видимые спутники",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Роуминг",
+ "positionEvent": "Событие",
+ "positionAlarm": "Тревога",
+ "positionStatus": "Статус",
+ "positionOdometer": "Одометр",
+ "positionServiceOdometer": "Одометр обслуживания",
+ "positionTripOdometer": "Одометр поездки",
+ "positionHours": "Часы",
+ "positionSteps": "Шаги",
+ "positionInput": "Входы",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Выходы",
+ "positionBatteryLevel": "Уровень заряда батареи",
+ "positionFuelConsumption": "Расход топлива",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Версия прошивки",
+ "positionVersionHw": "Версия устройства",
+ "positionIgnition": "Зажигание",
+ "positionFlags": "Флаги",
+ "positionCharge": "Заряд",
+ "positionIp": "IP",
+ "positionArchive": "Архив",
+ "positionVin": "VIN",
+ "positionApproximate": "Приблизительно",
+ "positionThrottle": "Дроссель",
+ "positionMotion": "Движение",
+ "positionArmed": "На охране",
+ "positionAcceleration": "Ускорение",
+ "positionTemp": "Температура",
+ "positionDeviceTemp": "Температура устройства",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Оператор",
+ "positionCommand": "Команда",
+ "positionBlocked": "Блокировка",
+ "positionDtcs": "Ошибки",
+ "positionObdSpeed": "OBD скорость",
+ "positionObdOdometer": "OBD одометр",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "ID водителя",
+ "positionCard": "Card",
+ "positionImage": "Изображение",
+ "positionVideo": "Видео",
+ "positionAudio": "Аудио",
+ "serverTitle": "Настройки сервера",
+ "serverZoom": "Приближение",
+ "serverRegistration": "Регистрация",
+ "serverReadonly": "Только просмотр",
+ "serverForceSettings": "Форсировать настройки",
+ "serverAnnouncement": "Объявление",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Карта",
+ "mapActive": "Активные карты",
+ "mapOverlay": "Слой карты",
+ "mapOverlayCustom": "Собственный слой",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API ключ",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather давление",
+ "mapOpenWeatherWind": "OpenWeather ветер",
+ "mapOpenWeatherTemperature": "OpenWeather температура",
+ "mapLayer": "Слой карты",
+ "mapCustom": "Пользовательский (XYZ)",
+ "mapCustomArcgis": "Пользовательский (ArcGIS)",
+ "mapCustomLabel": "Пользовательская карта",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google дороги",
+ "mapGoogleHybrid": "Google гибрид",
+ "mapGoogleSatellite": "Google спутник",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Ключ Bing Maps",
+ "mapBingRoad": "Bing Maps Дороги",
+ "mapBingAerial": "Bing Maps Спутник",
+ "mapBingHybrid": "Bing Maps Гибрид",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Яндекс Карты",
+ "mapYandexSat": "Яндекс Спутник",
+ "mapWikimedia": "Викимедиа",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Улицы",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Топография",
+ "mapMapboxSatellite": "Mapbox Спутник",
+ "mapMapboxKey": "Mapbox токен доступа",
+ "mapMapTilerBasic": "MapTiler простое",
+ "mapMapTilerHybrid": "MapTiler гибрид",
+ "mapMapTilerKey": "MapTiler ключ API",
+ "mapLocationIqStreets": "LocationIQ улицы",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ токен доступа",
+ "mapTomTomBasic": "TomTom простое",
+ "mapTomTomFlow": "TomTom движение потока",
+ "mapTomTomIncidents": "TomTom аварии в потоке",
+ "mapTomTomKey": "TomTom ключ API",
+ "mapHereBasic": "Простое",
+ "mapHereHybrid": "Гибрид",
+ "mapHereSatellite": "Спутники",
+ "mapHereFlow": "Движение потока",
+ "mapHereKey": "Ключ API",
+ "mapShapePolygon": "Многоугольник",
+ "mapShapeCircle": "Круг",
+ "mapShapePolyline": "Линия",
+ "mapLiveRoutes": " Живые маршруты",
+ "mapDirection": "Показать направление",
+ "mapCurrentLocation": "Текущее Местоположение",
+ "mapPoiLayer": "Слой POI",
+ "mapClustering": "Кластеризация маркеров",
+ "mapOnSelect": "Показать карту при выборе",
+ "mapDefault": "Карта по-умолчанию",
+ "stateTitle": "Состояние",
+ "stateName": "Параметр",
+ "stateValue": "Значение",
+ "commandTitle": "Команда",
+ "commandSend": "Отправить",
+ "commandSent": "Команда отправлена",
+ "commandQueued": "Команда добавлена в очередь",
+ "commandUnit": "Единицы",
+ "commandCustom": "Пользовательская команда",
+ "commandDeviceIdentification": "Идентификация устройства",
+ "commandPositionSingle": "Разовое отслеживание",
+ "commandPositionPeriodic": "Начать отслеживание",
+ "commandPositionStop": "Отменить отслеживание",
+ "commandEngineStop": "Заблокировать двигатель",
+ "commandEngineResume": "Разблокировать двигатель",
+ "commandAlarmArm": "Активировать сигнализацию",
+ "commandAlarmDisarm": "Деактивировать сигнализацию",
+ "commandAlarmDismiss": "Отключить сигнализацию",
+ "commandSetTimezone": "Настроить часовой пояс",
+ "commandRequestPhoto": "Запросить фото",
+ "commandPowerOff": "Выключить устройство",
+ "commandRebootDevice": "Перезагрузить устройство",
+ "commandFactoryReset": "Сброс к заводским настройкам",
+ "commandSendSms": "Отправить СМС",
+ "commandSendUssd": "Отправить USSD",
+ "commandSosNumber": "Настроить экстренный номер",
+ "commandSilenceTime": "Настроить время тишины",
+ "commandSetPhonebook": "Настроить телефонную книгу",
+ "commandVoiceMessage": "Голосовое сообщение",
+ "commandOutputControl": "Контроль выхода",
+ "commandVoiceMonitoring": "Голосовой контроль",
+ "commandSetAgps": "Настроить AGPS",
+ "commandSetIndicator": "Настроить индикатор",
+ "commandConfiguration": "Конфигурация",
+ "commandGetVersion": "Запросить версию",
+ "commandFirmwareUpdate": "Обновить прошивку",
+ "commandSetConnection": "Настроить соединение",
+ "commandSetOdometer": "Настроить одометр",
+ "commandGetModemStatus": "Запросить состояние модема",
+ "commandGetDeviceStatus": "Запросить состояние устройства",
+ "commandSetSpeedLimit": "Установить ограничение скорости",
+ "commandModePowerSaving": "Режим экономии энергии",
+ "commandModeDeepSleep": "Режим глубокого сна",
+ "commandAlarmGeofence": "Установить сигнал геозоны",
+ "commandAlarmBattery": "Установить сигнал батареи",
+ "commandAlarmSos": "Установить сигнал SOS",
+ "commandAlarmRemove": "Установить сигнал удаления",
+ "commandAlarmClock": "Установить сигнал часов",
+ "commandAlarmSpeed": "Установить сигнал скорости",
+ "commandAlarmFall": "Установить сигнал падения",
+ "commandAlarmVibration": "Установить сигнал вибрации",
+ "commandFrequency": "Частота",
+ "commandTimezone": "Смещение временной зоны",
+ "commandMessage": "Сообщение",
+ "commandRadius": "Радиус",
+ "commandEnable": "Включить",
+ "commandData": "Данные",
+ "commandIndex": "Индекс",
+ "commandPhone": "Номер телефона",
+ "commandServer": "Сервер",
+ "commandPort": "Порт",
+ "eventAll": "Все события",
+ "eventDeviceOnline": "Статус онлайн",
+ "eventDeviceUnknown": "Статус неизвестен",
+ "eventDeviceOffline": "Статус оффлайн",
+ "eventDeviceInactive": "Устройство неактивно",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Устройство двигается",
+ "eventDeviceStopped": "Устройство остановилось",
+ "eventDeviceOverspeed": "Превышено ограничение скорости",
+ "eventDeviceFuelDrop": "Слив топлива",
+ "eventDeviceFuelIncrease": "Увеличение расхода топлива",
+ "eventCommandResult": "Результат команды",
+ "eventGeofenceEnter": "Вход в геозону",
+ "eventGeofenceExit": "Выход из геозоны",
+ "eventAlarm": "Тревога",
+ "eventIgnitionOn": "Зажигание включено",
+ "eventIgnitionOff": "Зажигание выключено",
+ "eventMaintenance": "Требуется обслуживание",
+ "eventTextMessage": "Текстовое сообщение получено",
+ "eventDriverChanged": "Водитель изменен",
+ "eventMedia": "Медиа",
+ "eventsScrollToLast": "Прокрутка до конца",
+ "eventsSoundEvents": "Звук событий",
+ "eventsSoundAlarms": "Звук тревоги",
+ "alarmGeneral": "Общее",
+ "alarmSos": "SOS",
+ "alarmVibration": "Вибрация",
+ "alarmMovement": "Движение",
+ "alarmLowspeed": "Низкая скорость",
+ "alarmOverspeed": "Превышение скорости",
+ "alarmFallDown": "Падение",
+ "alarmLowPower": "Низкий уровень питания",
+ "alarmLowBattery": "Батарея разряжена",
+ "alarmFault": "Неисправность",
+ "alarmPowerOff": "Выключение",
+ "alarmPowerOn": "Включение",
+ "alarmDoor": "Дверь",
+ "alarmLock": "Закрыто",
+ "alarmUnlock": "Открыто",
+ "alarmGeofence": "Геозона",
+ "alarmGeofenceEnter": "Вход в геозону",
+ "alarmGeofenceExit": "Выход из геозоны",
+ "alarmGpsAntennaCut": "Отключение GPS-антенны",
+ "alarmAccident": "Авария",
+ "alarmTow": "Буксировка",
+ "alarmIdle": "Простой",
+ "alarmHighRpm": "Высокие обороты",
+ "alarmHardAcceleration": "Резкое ускорение",
+ "alarmHardBraking": "Резкое торможение",
+ "alarmHardCornering": "Резкий поворот",
+ "alarmLaneChange": "Смена полосы",
+ "alarmFatigueDriving": "Усталость водителя",
+ "alarmPowerCut": "Отключение питания",
+ "alarmPowerRestored": "Питание восстановлено",
+ "alarmJamming": "Заглушено",
+ "alarmTemperature": "Температура",
+ "alarmParking": "Парковка",
+ "alarmBonnet": "Капот",
+ "alarmFootBrake": "Ножной тормоз",
+ "alarmFuelLeak": "Утечка топлива",
+ "alarmTampering": "Вмешательство",
+ "alarmRemoving": "Извлечение",
+ "notificationType": "Тип уведомления",
+ "notificationAlways": "Все устройства",
+ "notificationNotificators": "Каналы",
+ "notificatorCommand": "Команда",
+ "notificatorWeb": "Веб",
+ "notificatorMail": "Почта",
+ "notificatorSms": "СМС",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Телеграмм",
+ "notificatorPushover": "Нажатие",
+ "reportReplay": "Воспроизвести",
+ "reportCombined": "Совместный",
+ "reportRoute": "Маршрут",
+ "reportEvents": "События",
+ "reportTrips": "Поездки",
+ "reportStops": "Остановки",
+ "reportSummary": "Сводка",
+ "reportDaily": "Ежедневная сводка",
+ "reportChart": "Диаграмма",
+ "reportConfigure": "Конфигурировать",
+ "reportEventTypes": "Тип события",
+ "reportChartType": "Тип диаграммы",
+ "reportShowMarkers": "Показать маркеры",
+ "reportExport": "Экспорт",
+ "reportEmail": "Отчет по почте",
+ "reportSchedule": "Запланированный",
+ "reportPeriod": "Период",
+ "reportCustom": "Пользовательский",
+ "reportToday": "Сегодня",
+ "reportYesterday": "Вчера",
+ "reportThisWeek": "Текущая неделя",
+ "reportPreviousWeek": "Предыдущая неделя",
+ "reportThisMonth": "Текущий месяц",
+ "reportPreviousMonth": "Предыдущий месяц",
+ "reportDeviceName": "Имя устройства",
+ "reportAverageSpeed": "Средняя скорость",
+ "reportMaximumSpeed": "Максимальная скорость",
+ "reportEngineHours": "Моточасы",
+ "reportDuration": "Длительность",
+ "reportStartDate": "Дата начала",
+ "reportStartTime": "Начальное время",
+ "reportStartAddress": "Начальный адрес",
+ "reportEndTime": "Конечное время",
+ "reportEndAddress": "Конечный адрес",
+ "reportSpentFuel": "Использовано топлива",
+ "reportStartOdometer": "Одометр, начало",
+ "reportEndOdometer": "Одометр, окончание",
+ "statisticsTitle": "Статистика",
+ "statisticsCaptureTime": "Время сбора",
+ "statisticsActiveUsers": "Активные пользователи",
+ "statisticsActiveDevices": "Активные устройства",
+ "statisticsRequests": "Запросы",
+ "statisticsMessagesReceived": "Сообщений получено",
+ "statisticsMessagesStored": "Сообщений сохранено",
+ "statisticsGeocoder": "Запросы геокодера",
+ "statisticsGeolocation": "Запросы геолокации",
+ "categoryArrow": "Стрелка",
+ "categoryDefault": "По умолчанию",
+ "categoryAnimal": "Животное",
+ "categoryBicycle": "Велосипед",
+ "categoryBoat": "Лодка",
+ "categoryBus": "Автобус",
+ "categoryCar": "Автомобиль",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Кран",
+ "categoryHelicopter": "Вертолет",
+ "categoryMotorcycle": "Мотоцикл",
+ "categoryOffroad": "Внедорожник",
+ "categoryPerson": "Человек",
+ "categoryPickup": "Пикап",
+ "categoryPlane": "Самолёт",
+ "categoryShip": "Корабль",
+ "categoryTractor": "Трактор",
+ "categoryTrain": "Поезд",
+ "categoryTram": "Трамвай",
+ "categoryTrolleybus": "Троллейбус",
+ "categoryTruck": "Грузовой автомобиль",
+ "categoryVan": "Фургон",
+ "categoryScooter": "Скутер",
+ "maintenanceStart": "Начало",
+ "maintenancePeriod": "Период"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/si.json b/legacy/web/l10n/si.json
new file mode 100644
index 00000000..9e8ad6af
--- /dev/null
+++ b/legacy/web/l10n/si.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "පූරණය ස්ථානයේ...",
+ "sharedHide": "සඟවන්න",
+ "sharedSave": "සුරකින්න",
+ "sharedUpload": "Upload",
+ "sharedSet": "සකසන්න",
+ "sharedCancel": "සිදු කරන්න",
+ "sharedCopy": "Copy",
+ "sharedAdd": "එක් කරන්න",
+ "sharedEdit": "සංස්කරණය",
+ "sharedRemove": "ඉවත් කරන්න",
+ "sharedRemoveConfirm": "අයිතමය ඉවත් කරන්නද?",
+ "sharedNoData": "දත්ත නැත",
+ "sharedSubject": "Subject",
+ "sharedYes": "ඔව්",
+ "sharedNo": "නැත",
+ "sharedKm": "කි.මී.",
+ "sharedMi": "සැතපුම්",
+ "sharedNmi": "nmi",
+ "sharedMeters": "එම්",
+ "sharedFeet": "අඩි",
+ "sharedKn": "kn",
+ "sharedKmh": "කි.මී/පැ",
+ "sharedMph": "mph",
+ "sharedHour": "පැය",
+ "sharedMinute": "විනාඩි",
+ "sharedSecond": "තත්පර",
+ "sharedDays": "දවස්",
+ "sharedHours": "පැය",
+ "sharedMinutes": "විනාඩි",
+ "sharedDecimalDegrees": "දශම සඳහා",
+ "sharedDegreesDecimalMinutes": "අංශක දශම මිනිත්තු",
+ "sharedDegreesMinutesSeconds": "දශම පිළිබඳව තප්පර",
+ "sharedName": "නම",
+ "sharedDescription": "සවිස්තරය",
+ "sharedSearch": "සොයන්න",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "භූ වැටිය",
+ "sharedGeofences": "භූ වැටි",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "දැනුම්දීම්",
+ "sharedNotification": "දැනුම්දීම",
+ "sharedAttributes": "උපලක්ෂණ",
+ "sharedAttribute": "උපලක්ෂණය",
+ "sharedDrivers": "රියදුරන්",
+ "sharedDriver": "රියදුරු",
+ "sharedArea": "ප්‍රදේශය",
+ "sharedSound": "දැනුම්දීමේ ශබ්දය",
+ "sharedType": "වර්ගය",
+ "sharedDistance": "දුර",
+ "sharedHourAbbreviation": "පැ.",
+ "sharedMinuteAbbreviation": "මි.",
+ "sharedSecondAbbreviation": "තත්.",
+ "sharedVoltAbbreviation": "වී",
+ "sharedLiterAbbreviation": "එල්",
+ "sharedGallonAbbreviation": "ගැලුම්",
+ "sharedLiter": "ලීටර",
+ "sharedImpGallon": "Imp. ගැලන්",
+ "sharedUsGallon": "එක්සත් ජනපද ගැලෝන්",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "සිතියම් තත්ත්වය",
+ "sharedComputedAttribute": "කළ ගුණය",
+ "sharedComputedAttributes": "සිදු කළ ගුණාංග",
+ "sharedCheckComputedAttribute": "කළ ගුණය පරීක්ෂා කරන්න",
+ "sharedExpression": "ප්රකාශනය",
+ "sharedDevice": "වැනි",
+ "sharedTest": "පරීක්ෂණය",
+ "sharedTestNotification": "අත්හදාබැලීමේ දැනුම්දීම යවන්න",
+ "sharedTestNotificators": "පරීක්ෂණ නාලිකා",
+ "sharedTestExpression": "පරීක්ෂණ ප්රකාශනය",
+ "sharedCalendar": "දින දසුන",
+ "sharedCalendars": "දින දසුන්",
+ "sharedFile": "ගොනුව",
+ "sharedSearchDevices": "සෙවුම් උපාංග",
+ "sharedSortBy": "අනුව තෝරන්න",
+ "sharedFilterMap": "සිතියම මත පෙරහන් කරන්න",
+ "sharedSelectFile": "ගොනුව තෝරන්න",
+ "sharedPhone": "දුරකථනය",
+ "sharedRequired": "අවශයි",
+ "sharedPreferences": "මනාපයන්",
+ "sharedPermissions": "අවසර",
+ "sharedConnections": "සම්බන්ධතා",
+ "sharedExtra": "අමතර",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "නූල්",
+ "sharedTypeNumber": "අංකය",
+ "sharedTypeBoolean": "බූලියන්",
+ "sharedTimezone": "වේලා කලාපය",
+ "sharedInfoTitle": "තොරතුරු",
+ "sharedSavedCommand": "විධානය සුරකින ලදී",
+ "sharedSavedCommands": "විධාන සුරකින",
+ "sharedNew": "අලුත්…",
+ "sharedShowAddress": "ලිපිනය පෙන්වන්න",
+ "sharedShowDetails": "වැඩිපුර විස්තර",
+ "sharedDisabled": "අබල කර ඇත",
+ "sharedMaintenance": "නඩත්තුව",
+ "sharedDeviceAccumulators": "සමුච්චය කරන්නන්",
+ "sharedAlarms": "අනතුරු ඇඟවීම්",
+ "sharedLocation": "ස්ථානය",
+ "sharedImport": "ආනයන",
+ "sharedColumns": "තීරු",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "වේග සීමාව",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "බහු රේඛා දුර",
+ "attributeReportIgnoreOdometer": "වාර්තාව: සැතපුම්මානය නොසලකන්න",
+ "attributeWebReportColor": "වියමන: පාට වාර්තා කරන්න",
+ "attributeDevicePassword": "කැමති මුරපදය",
+ "attributeDeviceImage": "උපාංග රූපය",
+ "attributeDeviceInactivityStart": "උපාංගය අක්රිය වීම ආරම්භය",
+ "attributeDeviceInactivityPeriod": "උපාංග අක්‍රිය කාලය",
+ "attributeProcessingCopyAttributes": "සැකසීම: උපලක්ෂණ පිටපත් කරන්න",
+ "attributeColor": "වර්ණ",
+ "attributeWebLiveRouteLength": "වෙබ්: සජීවී මාර්ග දිග",
+ "attributeWebSelectZoom": "වෙබ්: විශාලනය කරන්න තෝරන්න",
+ "attributeWebMaxZoom": "වියමන: උපරිම විශාලනය",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "තැපෑල: ස.තැ.මා.කේ. සත්කාරකය",
+ "attributeMailSmtpPort": "තැපෑල: ස.තැ.මා.කේ. කෙවෙනිය",
+ "attributeMailSmtpStarttlsEnable": "තැපෑල: SMTP STARTTLS සබල කරන්න",
+ "attributeMailSmtpStarttlsRequired": "තැපෑල: SMTP STARTTLS අවශ්‍යයි",
+ "attributeMailSmtpSslEnable": "තැපෑල: SMTP SSL සක්රිය කරන්න",
+ "attributeMailSmtpSslTrust": "තැපෑල: SMTP SSL භාරය",
+ "attributeMailSmtpSslProtocols": "තැපෑල: SMTP SSL ප්‍රොටෝකෝල",
+ "attributeMailSmtpFrom": "තැපෑල: SMTP වෙතින්",
+ "attributeMailSmtpAuth": "තැපෑල: SMTP Auth සක්රිය කරන්න",
+ "attributeMailSmtpUsername": "තැපෑල: ස.තැ.මා.කේ. පර්යේෂණනාමය",
+ "attributeMailSmtpPassword": "තැපෑල: ස.තැ.මා.කේ. මුරපදය",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: කණ්ඩායම් අබල කරන්න",
+ "attributeUiDisableEvents": "අ.මු.: සිදුවීම් අබල කරන්න",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: ධාවක අක්‍රීය කරන්න",
+ "attributeUiDisableComputedAttributes": "UI: ගණනය කළ ගුණාංග අක්‍රීය කරන්න",
+ "attributeUiDisableCalendars": "අ.මු.: දින දසුන අබල කරන්න",
+ "attributeUiDisableMaintenance": "UI: නඩත්තු කිරීම අබල කරන්න",
+ "attributeUiHidePositionAttributes": "UI: ස්ථාන ගුණාංග සඟවන්න",
+ "attributeUiDisableLoginLanguage": "UI: පිවිසුම් භාෂාව අක්‍රීය කරන්න",
+ "attributeNotificationTokens": "දැනුම්දීම් ටෝකන",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "දෝෂයකි",
+ "errorGeneral": "වලංගු නොවන පරාමිති හෝ සීමාවන් උල්ලංඝනය කිරීම",
+ "errorConnection": "සම්බන්ධතාවේ දෝෂයකි",
+ "errorSocket": "වෙබ් සොකට් සම්බන්ධතා දෝෂයකි",
+ "errorZero": "ශුන්‍ය විය හැකියි",
+ "userEmail": "වි-තැපෑල",
+ "userPassword": "මුරපදය",
+ "userAdmin": "පරිපාලක",
+ "userRemember": "මතක තබාගන්න",
+ "userExpirationTime": "කල් ඉකුත්වීම",
+ "userDeviceLimit": "උපාංග සීමාව",
+ "userUserLimit": "පරිශීලක සීමාව",
+ "userDeviceReadonly": "ඇතුළත් කියවීම පමණි",
+ "userLimitCommands": "සීමිත විධානයන්",
+ "userDisableReports": "වාර්තා අක්රිය කරන්න",
+ "userFixedEmail": "No Email Change",
+ "userToken": "ටෝකනය",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "ඇතුල් වන්න",
+ "loginLanguage": "භාෂාව",
+ "loginReset": "මුරපදය නැවත සකසන්න",
+ "loginRegister": "ලියාපදිංචි වන්න",
+ "loginLogin": "ඇතුල් වන්න",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "වි-තැපැල් ලිපිනය හෝ මුරපදය වැරදිය!",
+ "loginCreated": "නව පරිශීලකයෙකු ලියාපදිංචි වී ඇත",
+ "loginResetSuccess": "ඔබගේ විද්යුත් තැපෑල පරීක්ෂා කරන්න",
+ "loginUpdateSuccess": "නව මුරපදය සකසා ඇත",
+ "loginLogout": "නික්මෙන්න",
+ "loginLogo": "ලාංඡනය",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "උපාංග සහ තත්ත්වය",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "උපාංග",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "හඳුන්වනවා",
+ "deviceModel": "ආකෘතිය",
+ "deviceContact": "අමතන්න",
+ "deviceCategory": "ප්‍රවර්ගය",
+ "deviceLastUpdate": "අවසන් යාවත්කාලය",
+ "deviceCommand": "විධානය",
+ "deviceFollow": "ලුහුබඳින්න",
+ "deviceTotalDistance": "මුළු දුර",
+ "deviceStatus": "තත්ත්වය",
+ "deviceStatusOnline": "ඔන්ලයින්",
+ "deviceStatusOffline": "නොබැඳි",
+ "deviceStatusUnknown": "නොදන්නා",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "සමූහය",
+ "groupParent": "සමූහය",
+ "groupNoGroup": "සමූහ නැත",
+ "settingsTitle": "සැකසුම්",
+ "settingsUser": "ගැන",
+ "settingsGroups": "සමූහ",
+ "settingsServer": "සේවාදායකයා",
+ "settingsUsers": "පරිශීලකයින්",
+ "settingsDistanceUnit": "දුරස්ථ ඒකකය",
+ "settingsAltitudeUnit": "උන්නතාංශ ඒකකය",
+ "settingsSpeedUnit": "වේග නියමිතක්",
+ "settingsVolumeUnit": "පරිමාව ඒකකය",
+ "settingsTwelveHourFormat": "පැය 12 ආකෘතිය",
+ "settingsCoordinateFormat": "ඛණ්ඩාංක ආකෘතිය",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "වාර්තාව",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "වැනි",
+ "reportGroup": "සමුහය",
+ "reportFrom": "සිට",
+ "reportTo": "දක්වා",
+ "reportShow": "පෙන්වන්න",
+ "reportClear": "හිස් කරන්න",
+ "linkGoogleMaps": "ගුගල් සිතියම්",
+ "linkAppleMaps": "ඇපල් සිතියම්",
+ "linkStreetView": "වීථි දසුන",
+ "positionFixTime": "කාලය නිවැරදි කරන්න",
+ "positionDeviceTime": "උපාංග කාලය",
+ "positionServerTime": "සේවාදායක කාලය",
+ "positionValid": "වලංගු",
+ "positionAccuracy": "නිරවද්යතාව",
+ "positionLatitude": "අක්ෂාංශ",
+ "positionLongitude": "දේශාංශ",
+ "positionAltitude": "උන්නතාංශය",
+ "positionSpeed": "වේගවත්",
+ "positionCourse": "දිගංශය",
+ "positionAddress": "ලිපිනය",
+ "positionProtocol": "කෙටුම්පත",
+ "positionDistance": "දුර",
+ "positionRpm": "ආර්පීඑම්",
+ "positionFuel": "ඉන්ධන",
+ "positionPower": "බලය",
+ "positionBattery": "වියළිකෝෂය",
+ "positionRaw": "අමු",
+ "positionIndex": "දර්ශකය",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "චන්ද්‍රිකා",
+ "positionSatVisible": "දෘෂ්‍ය චන්ද්‍රිකා",
+ "positionRssi": "ආර්එස්එස්අයි",
+ "positionGps": "ගි.පි.එස්",
+ "positionRoaming": "රෝමිං",
+ "positionEvent": "සිදුවීම",
+ "positionAlarm": "අනතුරු ඇඟවීම",
+ "positionStatus": "තත්ත්වය",
+ "positionOdometer": "සැතපුම්මානය",
+ "positionServiceOdometer": "සේවා සැතපුම්මානය",
+ "positionTripOdometer": "චාරිකා සැතපුම්මානය",
+ "positionHours": "පැය",
+ "positionSteps": "පියවර",
+ "positionInput": "ආදානය",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "ප්‍රතිදානය",
+ "positionBatteryLevel": "විදුලිකෝෂයේ මට්ටමට",
+ "positionFuelConsumption": "ඉන්ධන සඳහා",
+ "positionRfid": "RFID",
+ "positionVersionFw": "ස්ථිරාංගයේ වෙනස්",
+ "positionVersionHw": "දෘඩංගයේ වෙනස්",
+ "positionIgnition": "තාපනය",
+ "positionFlags": "කොඩි",
+ "positionCharge": "ගාස්තුව",
+ "positionIp": "අ.ජා.කේ.",
+ "positionArchive": "සංරක්ෂිතය",
+ "positionVin": "VIN",
+ "positionApproximate": "දළ වශයෙන්",
+ "positionThrottle": "Throttle",
+ "positionMotion": "දක්වා",
+ "positionArmed": "ආයුධ",
+ "positionAcceleration": "ත්වරණය",
+ "positionTemp": "උෂ්ණත්වය",
+ "positionDeviceTemp": "උෂ්ණත්වයේ උෂ්ණත්වය",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "ක්‍රියාකරු",
+ "positionCommand": "විධානය",
+ "positionBlocked": "අවහිර කර ඇත",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD වේගය",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "රියදුරු අනන්‍ය හැඳුනුම්පත",
+ "positionCard": "Card",
+ "positionImage": "රූප",
+ "positionVideo": "Video",
+ "positionAudio": "ශ්රව්ය උපකරණ",
+ "serverTitle": "සේවාදායකයේ සැකසුම්",
+ "serverZoom": "විශාලනය",
+ "serverRegistration": "ලියාපදිංචි කිරීම",
+ "serverReadonly": "කියවීමට පමණි",
+ "serverForceSettings": "බල සැකසීම්",
+ "serverAnnouncement": "නිවේදනය",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "දක්වා",
+ "mapActive": "ක්රියාකාරී සිතියම්",
+ "mapOverlay": "සිතියම උඩ තට්ටුව",
+ "mapOverlayCustom": "අභිරුචි ආවරණයක්",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API යතුර",
+ "mapOpenWeatherClouds": "විවෘත කාලගුණ වලාකුළු",
+ "mapOpenWeatherPrecipitation": "විවෘත කාලගුණ වර්ෂාපතනය",
+ "mapOpenWeatherPressure": "විවෘත කාලගුණ පීඩනය",
+ "mapOpenWeatherWind": "විවෘත කාලගුණ සුළඟ",
+ "mapOpenWeatherTemperature": "විවෘත කාලගුණ උෂ්ණත්වය",
+ "mapLayer": "සිතියම් ස්තරය",
+ "mapCustom": "අභිරුචි (XYZ)",
+ "mapCustomArcgis": "අභිරුචි (ArcGIS)",
+ "mapCustomLabel": "අභිරුචි සිතියම",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "බිං මැප්ස් යතුර",
+ "mapBingRoad": "බිං මැප්ස් පාර",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "යාන්ඩෙක්ස් සිතියම",
+ "mapYandexSat": "යාන්ඩෙක්ස් චන්ද්‍රිකාව",
+ "mapWikimedia": "විකිමීඩියා",
+ "mapOrdnanceSurvey": "යුධෝපකරණ සමීක්ෂණය",
+ "mapMapboxStreets": "සිතියම් පෙට්ටි වීදි",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox එළිමහන්",
+ "mapMapboxSatellite": "Mapbox චන්ද්‍රිකාව",
+ "mapMapboxKey": "Mapbox ප්රවේශ ටෝකනය",
+ "mapMapTilerBasic": "MapTiler මූලික",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API යතුර",
+ "mapLocationIqStreets": "LocationIQ වීදි",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ ප්‍රවේශ ටෝකනය",
+ "mapTomTomBasic": "TomTom මූලික",
+ "mapTomTomFlow": "TomTom රථවාහන ප්රවාහය",
+ "mapTomTomIncidents": "TomTom රථවාහන සිදුවීම්",
+ "mapTomTomKey": "TomTom API යතුර",
+ "mapHereBasic": "මෙන්න Basic",
+ "mapHereHybrid": "මෙන්න Hybrid",
+ "mapHereSatellite": "මෙන්න සැටලයිට්",
+ "mapHereFlow": "මෙන්න Traffic Flow",
+ "mapHereKey": "මෙන්න API යතුර",
+ "mapShapePolygon": "බහුඅශ්‍රය",
+ "mapShapeCircle": "වෘත්තය",
+ "mapShapePolyline": "බහු රේඛාව",
+ "mapLiveRoutes": "සජීවී මාර්ග",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "වත්මන් ස්ථානය",
+ "mapPoiLayer": "POI ස්තරය",
+ "mapClustering": "සලකුණු පොකුරු කිරීම",
+ "mapOnSelect": "තේරීම මත සිතියම පෙන්වන්න",
+ "mapDefault": "Default Map",
+ "stateTitle": "තත්ත්වය",
+ "stateName": "ගුණාංගය",
+ "stateValue": "අගය",
+ "commandTitle": "විධානය",
+ "commandSend": "යවන්න",
+ "commandSent": "විධානය යවා ඇත",
+ "commandQueued": "විධානය පෝලිමේ",
+ "commandUnit": "සඳහා",
+ "commandCustom": "අභිරුචි විධානය",
+ "commandDeviceIdentification": "හඳුනා ගැනීම",
+ "commandPositionSingle": "තනි වාර්තාව",
+ "commandPositionPeriodic": "ආවර්තිතාව වාර්තා කරන්න",
+ "commandPositionStop": "වාර්තා කිරීම නවත්වන්න",
+ "commandEngineStop": "එන්ජින් නැවතුම",
+ "commandEngineResume": "එන්ජින් Resume",
+ "commandAlarmArm": "ආම් එලාම්",
+ "commandAlarmDisarm": "අනතුරු ඇඟවීම නිරායුධ කරන්න",
+ "commandAlarmDismiss": "එලාමය අස් කරන්න",
+ "commandSetTimezone": "කලාපය සකසන්න",
+ "commandRequestPhoto": "ඡායාරූප ඉල්ලීම",
+ "commandPowerOff": "උපාංගය ක්‍රියා විරහිත කරන්න",
+ "commandRebootDevice": "අපට යළි ආරම්භ කරන්න",
+ "commandFactoryReset": "කර්මාන්තශාලා යළි පිහිටුවීම",
+ "commandSendSms": "කෙටි පණිවිඩ යවන්න",
+ "commandSendUssd": "USSD යවන්න",
+ "commandSosNumber": "SOS අංකය සකසන්න",
+ "commandSilenceTime": "නිශ්ශබ්දතාවයේ වේලාව සකසන්න",
+ "commandSetPhonebook": "දුරකථනපොත සකසන්න",
+ "commandVoiceMessage": "සඳහා පණිවිඩය",
+ "commandOutputControl": "ප්රතිදාන පාලනය",
+ "commandVoiceMonitoring": "හඬ නිරීක්ෂණ",
+ "commandSetAgps": "AGPS සකසන්න",
+ "commandSetIndicator": "දර්ශකය සකසන්න",
+ "commandConfiguration": "වින්‍යාසය",
+ "commandGetVersion": "සහ ගන්න",
+ "commandFirmwareUpdate": "ස්ථිරාංගය යථාවත්කාල කරන්න",
+ "commandSetConnection": "සම්බන්ධතාවය සකසන්න",
+ "commandSetOdometer": "සැතපුම්මානය සකසන්න",
+ "commandGetModemStatus": "මෝඩමය තත්ත්වය ලබා ගන්න",
+ "commandGetDeviceStatus": "ලබා ගැනීමේ තත්ත්වය ගන්න",
+ "commandSetSpeedLimit": "වේග සීමාව සකසන්න",
+ "commandModePowerSaving": "බලශක්ති ඉතිරිකිරීමේ මාදිලිය",
+ "commandModeDeepSleep": "ගැඹුරු නින්ද මාදිලිය",
+ "commandAlarmGeofence": "Geofence එලාම් සකසන්න",
+ "commandAlarmBattery": "බැටරි එලාම් සකසන්න",
+ "commandAlarmSos": "SOS එලාම් සකසන්න",
+ "commandAlarmRemove": "ඉවත් කිරීමේ අනතුරු ඇඟවීම සකසන්න",
+ "commandAlarmClock": "ඔරලෝසු එලාම් සකසන්න",
+ "commandAlarmSpeed": "වේග අනතුරු ඇඟවීම සකසන්න",
+ "commandAlarmFall": "වැටීම අනතුරු ඇඟවීම සකසන්න",
+ "commandAlarmVibration": "කම්පන එලාම් සකසන්න",
+ "commandFrequency": "සංඛ්යාතය",
+ "commandTimezone": "කාල කලාප ඕෆ්සෙට්",
+ "commandMessage": "පණිවිඩය",
+ "commandRadius": "ආරය",
+ "commandEnable": "සබල කරන්න",
+ "commandData": "දත්ත",
+ "commandIndex": "දර්ශකය",
+ "commandPhone": "දුරකථන අංකය",
+ "commandServer": "සේවාදායකයා",
+ "commandPort": "වරාය",
+ "eventAll": "සියලු සිදුවීම්",
+ "eventDeviceOnline": "මාර්ගගත තත්ත්වය",
+ "eventDeviceUnknown": "තත්ත්වය නොදනී",
+ "eventDeviceOffline": "නොබැඳි තත්ත්වය",
+ "eventDeviceInactive": "උපාංගය අක්‍රියයි",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "උපාංගය චලනය",
+ "eventDeviceStopped": "උපාංගය නතර විය",
+ "eventDeviceOverspeed": "වේග සීමාව ඉක්මවා ඇත",
+ "eventDeviceFuelDrop": "ඉන්ධන පහත වැටීම",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "විධානයේ ප්‍රකාශය",
+ "eventGeofenceEnter": "Geofence ඇතුල් විය",
+ "eventGeofenceExit": "Geofence ඉවත් විය",
+ "eventAlarm": "අනතුරු ඇඟවීම",
+ "eventIgnitionOn": "ගිනි දැල්වීම",
+ "eventIgnitionOff": "ජ්වලනය නිවා දමයි",
+ "eventMaintenance": "නඩත්තු කිරීම අවශ්ය වේ",
+ "eventTextMessage": "කෙටි පණිවිඩයක් ලැබිණි",
+ "eventDriverChanged": "රියදුරු වෙනස් විය",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "අන්තිමට අනුචලනය කරන්න",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "ජනරාල්",
+ "alarmSos": "SOS",
+ "alarmVibration": "කම්පනය",
+ "alarmMovement": "චලනය",
+ "alarmLowspeed": "අඩු වේගය",
+ "alarmOverspeed": "අධික වේගය",
+ "alarmFallDown": "වැටෙන්න",
+ "alarmLowPower": "අඩු බලය",
+ "alarmLowBattery": "අඩු බැටරි",
+ "alarmFault": "වරද",
+ "alarmPowerOff": "බලය අක්‍රියයි",
+ "alarmPowerOn": "පවර් ඔන්",
+ "alarmDoor": "දොර",
+ "alarmLock": "අගුළු දමන්න",
+ "alarmUnlock": "අගුළු හරින්න",
+ "alarmGeofence": "භූ වැට",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence පිටවීම",
+ "alarmGpsAntennaCut": "GPS ඇන්ටෙනා කැපීම",
+ "alarmAccident": "අනතුරක්",
+ "alarmTow": "ඇදගෙන යාම",
+ "alarmIdle": "නිෂ්ක්‍රීයයි",
+ "alarmHighRpm": "ඉහළ ආර්පීඑම්",
+ "alarmHardAcceleration": "දෘඪ ත්වරණය",
+ "alarmHardBraking": "දැඩි තිරිංග",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "මංතීරු වෙනස් කිරීම",
+ "alarmFatigueDriving": "තෙහෙට්ටුව රිය පැදවීම",
+ "alarmPowerCut": "විදුලි කප්පාදුව",
+ "alarmPowerRestored": "බලය යථා තත්ත්වයට පත් විය",
+ "alarmJamming": "හිරවීම",
+ "alarmTemperature": "උෂ්ණත්වය",
+ "alarmParking": "වාහන නැවැත්වීම",
+ "alarmBonnet": "බොනට්",
+ "alarmFootBrake": "ෆුට් බ්‍රේක්",
+ "alarmFuelLeak": "ඉන්ධන කාන්දු වීම",
+ "alarmTampering": "විකෘති කිරීම",
+ "alarmRemoving": "ඉවත් කිරීම",
+ "notificationType": "දැනුම්දීම් වර්ග",
+ "notificationAlways": "සියලුම උපාංග",
+ "notificationNotificators": "නාලිකා",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "වෙබ්",
+ "notificatorMail": "තැපෑල",
+ "notificatorSms": "කෙටි පණිවිඩ",
+ "notificatorFirebase": "ගිනි පදනම",
+ "notificatorTraccar": "ට්රැකර්",
+ "notificatorTelegram": "විදුලි පණිවුඩ",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "නැවත ධාවනය කරන්න",
+ "reportCombined": "Combined",
+ "reportRoute": "ගමන් කිරීමට",
+ "reportEvents": "සිද්ධි",
+ "reportTrips": "චාරිකා",
+ "reportStops": "නැවතීම්",
+ "reportSummary": "සාරාංශය",
+ "reportDaily": "දෛනික සාරාංශය",
+ "reportChart": "සටහන",
+ "reportConfigure": "වින්‍යාසගත කරන්න",
+ "reportEventTypes": "සිදුවීම් වර්ග",
+ "reportChartType": "ප්‍රස්ථාර වර්ගය",
+ "reportShowMarkers": "සලකුණු පෙන්වන්න",
+ "reportExport": "නිර්යාත",
+ "reportEmail": "ඊමේල් වාර්තාව",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "කාලය",
+ "reportCustom": "අභිරුචි",
+ "reportToday": "අද",
+ "reportYesterday": "කටයුතු",
+ "reportThisWeek": "මෙම සතිය",
+ "reportPreviousWeek": "පසුගිය සතියේ",
+ "reportThisMonth": "මෙම මාසය",
+ "reportPreviousMonth": "පසුගිය මාසය",
+ "reportDeviceName": "ඇතුලත්වේ නම",
+ "reportAverageSpeed": "සාමාන්‍ය වේගය",
+ "reportMaximumSpeed": "උපරිම වේගය",
+ "reportEngineHours": "එන්ජින් පැය",
+ "reportDuration": "කාලසීමාව",
+ "reportStartDate": "ආරම්භක දිනය",
+ "reportStartTime": "ආරම්භක වේලාව",
+ "reportStartAddress": "ආරම්භ ලිපිනය",
+ "reportEndTime": "අවසානය",
+ "reportEndAddress": "අවසාන ලිපිනය",
+ "reportSpentFuel": "වැයවූ ඉන්ධන",
+ "reportStartOdometer": "Odometer ආරම්භය",
+ "reportEndOdometer": "Odometer අවසානය",
+ "statisticsTitle": "සංඛ්යාලේඛන",
+ "statisticsCaptureTime": "අල්ලා ගැනීමේ කාලය",
+ "statisticsActiveUsers": "ක්‍රියාකාරී පරිශීලකයින්",
+ "statisticsActiveDevices": "ක්රියාකාරී උපාංග",
+ "statisticsRequests": "ඉල්ලීම්",
+ "statisticsMessagesReceived": "ලැබුණු පණිවිඩ",
+ "statisticsMessagesStored": "ගබඩා කර ඇති පණිවිඩ",
+ "statisticsGeocoder": "භූ කේත ඉල්ලීම්",
+ "statisticsGeolocation": "භූගෝලීය ඉල්ලීම්",
+ "categoryArrow": "ඊතලය",
+ "categoryDefault": "පෙරනිමි",
+ "categoryAnimal": "සතුන්",
+ "categoryBicycle": "පාපැදිය",
+ "categoryBoat": "බෝට්ටුව",
+ "categoryBus": "බස්",
+ "categoryCar": "මෝටර් රථ",
+ "categoryCamper": "Camper",
+ "categoryCrane": "දොඹකරය",
+ "categoryHelicopter": "හෙලිකොප්ටරය",
+ "categoryMotorcycle": "යතුරුපැදිය",
+ "categoryOffroad": "පාරෙන් පිට",
+ "categoryPerson": "පුද්ගලයා",
+ "categoryPickup": "අවුලා ගන්න",
+ "categoryPlane": "ගුවන්යානය",
+ "categoryShip": "නැව",
+ "categoryTractor": "ට්රැක්ටරය",
+ "categoryTrain": "දුම්රිය",
+ "categoryTram": "ට්‍රෑම් රථය",
+ "categoryTrolleybus": "ට්රොලිබස්",
+ "categoryTruck": "ට්රක් රථය",
+ "categoryVan": "වෑන්",
+ "categoryScooter": "ස්කූටරය",
+ "maintenanceStart": "ආරම්භය",
+ "maintenancePeriod": "කාලය"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/sk.json b/legacy/web/l10n/sk.json
new file mode 100644
index 00000000..e4aebedc
--- /dev/null
+++ b/legacy/web/l10n/sk.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Načítava...",
+ "sharedHide": "Schovať",
+ "sharedSave": "Uložiť",
+ "sharedUpload": "Upload",
+ "sharedSet": "Nastaviť",
+ "sharedCancel": "Zrušiť",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Pridať",
+ "sharedEdit": "Upraviť",
+ "sharedRemove": "Odstrániť",
+ "sharedRemoveConfirm": "Odstrániť položku?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "Km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "Km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Hodina",
+ "sharedMinute": "Minúta",
+ "sharedSecond": "Sekunda",
+ "sharedDays": "dni",
+ "sharedHours": "hodiny",
+ "sharedMinutes": "minúty",
+ "sharedDecimalDegrees": "Desatinné stupne",
+ "sharedDegreesDecimalMinutes": "Stupne desatinných minút",
+ "sharedDegreesMinutesSeconds": "Stupne desatinných sekúnd",
+ "sharedName": "Meno",
+ "sharedDescription": "Popis",
+ "sharedSearch": "Hľadať",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geofence",
+ "sharedGeofences": "Geofences",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Notifikácie",
+ "sharedNotification": "Notifikácia",
+ "sharedAttributes": "Atribúty",
+ "sharedAttribute": "Atribút",
+ "sharedDrivers": "Vodiči",
+ "sharedDriver": "Vodič",
+ "sharedArea": "Oblasť",
+ "sharedSound": "Notifikačný zvuk",
+ "sharedType": "Typ",
+ "sharedDistance": "Vzdialenosť",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Britský galón",
+ "sharedUsGallon": "Americký galón",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Získať mapu štátu",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "Výraz",
+ "sharedDevice": "Zariadenie",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Pošli skúšobnú notifikáciu",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Kalendár",
+ "sharedCalendars": "Kalendáre",
+ "sharedFile": "Súbor",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Vyberte súbor",
+ "sharedPhone": "Telefón",
+ "sharedRequired": "Požadované",
+ "sharedPreferences": "Preferencie",
+ "sharedPermissions": "Povolenia",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Reťazec",
+ "sharedTypeNumber": "Číslo",
+ "sharedTypeBoolean": "Binárna hodnota",
+ "sharedTimezone": "Časová zóna",
+ "sharedInfoTitle": "Informácie",
+ "sharedSavedCommand": "Uložený príkaz",
+ "sharedSavedCommands": "Uložené príkazy",
+ "sharedNew": "Nový...",
+ "sharedShowAddress": "Zobraziť adresu",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Vypnuté",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Upozornenia",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Limit rýchlosti",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Report: Ignoruj kilometrovník",
+ "attributeWebReportColor": "Web: Farba reportu",
+ "attributeDevicePassword": "Heslo zaridenia",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "Farba",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximálne priblíženie",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "E-Mail: SMTP Host",
+ "attributeMailSmtpPort": "E-Mail: SMTP Port",
+ "attributeMailSmtpStarttlsEnable": "E-Mail: SMTP STARTTLS Zapnuté",
+ "attributeMailSmtpStarttlsRequired": "E-Mail: SMTP STARTTLS Povinná",
+ "attributeMailSmtpSslEnable": "Mail: Povolenie SMTP SSL",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL Protokoly",
+ "attributeMailSmtpFrom": "Mail: SMTP Od",
+ "attributeMailSmtpAuth": "Mail: SMTP Auth Enable",
+ "attributeMailSmtpUsername": "Mail: SMTP Používateľské meno",
+ "attributeMailSmtpPassword": "Mail: SMTP Heslo",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Zakázať udalosti",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Zakázať vodičov",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Zakázať kalendáre",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Chyba",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "Chyba pripojenia",
+ "errorSocket": "Chyba pripojenia web konektora",
+ "errorZero": "Can't be zero",
+ "userEmail": "E-mail",
+ "userPassword": "Heslo",
+ "userAdmin": "Admin",
+ "userRemember": "Zapamätať",
+ "userExpirationTime": "Uplynutie platnosti",
+ "userDeviceLimit": "Limit zariadenia",
+ "userUserLimit": "Obmedzenie používateľov",
+ "userDeviceReadonly": "Zariadenie len na čítanie",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Prihlásenie",
+ "loginLanguage": "Jazyk",
+ "loginReset": "Reset Password",
+ "loginRegister": "Registrovať",
+ "loginLogin": "Prihlásenie",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Nesprávna e-mailová adresa alebo heslo",
+ "loginCreated": "Nový užívateľ sa zaregistroval",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Odhlásiť",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Zariadenia a Status",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Zariadena",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifikátor",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategória",
+ "deviceLastUpdate": "Posledný update",
+ "deviceCommand": "Príkaz",
+ "deviceFollow": "Nasleduj",
+ "deviceTotalDistance": "Celková vzdialenosť",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Neznáme",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Skupina",
+ "groupParent": "Skupina",
+ "groupNoGroup": "Žiadna skupina",
+ "settingsTitle": "Nastavenia",
+ "settingsUser": "Účet",
+ "settingsGroups": "Skupiny",
+ "settingsServer": "Server",
+ "settingsUsers": "Používatelia",
+ "settingsDistanceUnit": "Jednotka vzdialenosti",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Jednotka rýchlosti",
+ "settingsVolumeUnit": "Jednotka objemu",
+ "settingsTwelveHourFormat": "12-hodinový formát",
+ "settingsCoordinateFormat": "Formát koordinátov",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Správy",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Zariadenie",
+ "reportGroup": "Skupina",
+ "reportFrom": "Od",
+ "reportTo": "Do",
+ "reportShow": "Zobraziť",
+ "reportClear": "Vyčistiť",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Platný",
+ "positionAccuracy": "Presnosť",
+ "positionLatitude": "Šírka",
+ "positionLongitude": "Dĺžka",
+ "positionAltitude": "Výška",
+ "positionSpeed": "Rýchlosť jazdy",
+ "positionCourse": "Kurz",
+ "positionAddress": "Adresa",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Vzdialenosť",
+ "positionRpm": "OZM",
+ "positionFuel": "Palivo",
+ "positionPower": "Napätie",
+ "positionBattery": "Baterka",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satelity",
+ "positionSatVisible": "Viditeľné satelity",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Udalosť",
+ "positionAlarm": "Upozornenie",
+ "positionStatus": "Stav",
+ "positionOdometer": "Kilometrovník",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hodiny",
+ "positionSteps": "Steps",
+ "positionInput": "Vstup",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Výstup",
+ "positionBatteryLevel": "Stav batérie",
+ "positionFuelConsumption": "Spotreba paliva",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Verzia firmvéru",
+ "positionVersionHw": "Verzia hardvéru",
+ "positionIgnition": "Zapaľovanie",
+ "positionFlags": "Značky",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archív",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Pohyb",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Zrýchlenie",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Teplota zariadenia",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operátor",
+ "positionCommand": "Príkaz",
+ "positionBlocked": "Blokované",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD rýchlosť",
+ "positionObdOdometer": "OBD kilometrovník",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Unikátne ID vodiča",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Nastavenie servera",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registrácia",
+ "serverReadonly": "Iba na čítanie",
+ "serverForceSettings": "Nastavenie sily",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Mapa",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Mapové vrstvy",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Klúč Bing Maps",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Arial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex mapa",
+ "mapYandexSat": "Yandex satelit",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polygón",
+ "mapShapeCircle": "Kruh",
+ "mapShapePolyline": "Lomená čiara",
+ "mapLiveRoutes": "Live Routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Parametre",
+ "stateName": "Parameter",
+ "stateValue": "Hodnota",
+ "commandTitle": "Príkaz",
+ "commandSend": "Odoslať",
+ "commandSent": "Príkaz odoslaný",
+ "commandQueued": "Command queued",
+ "commandUnit": "Jednotka",
+ "commandCustom": "Vlastný príkaz",
+ "commandDeviceIdentification": "Identifikácia zariadenia",
+ "commandPositionSingle": "Jednoduché podávanie správ",
+ "commandPositionPeriodic": "Pravidelné podávanie správ",
+ "commandPositionStop": "Zastavte podávanie správ",
+ "commandEngineStop": "Zastavenie motora",
+ "commandEngineResume": "Spustenie motora",
+ "commandAlarmArm": "Nastaviť upozornenie",
+ "commandAlarmDisarm": "Zrušiť upozornenie",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Nastaviť časovú zónu",
+ "commandRequestPhoto": "Poslať fotku",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Rebootovať zariadenie",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Postať SMS",
+ "commandSendUssd": "Postať USSD",
+ "commandSosNumber": "Nastaviť čislo SOS",
+ "commandSilenceTime": "Nastav tichý čas",
+ "commandSetPhonebook": "Nastav telefónny zoznam",
+ "commandVoiceMessage": "Hlasové správy",
+ "commandOutputControl": "Výstupná kontrola",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Nastaviť AGPS",
+ "commandSetIndicator": "Nastavte ukazovateľ",
+ "commandConfiguration": "Konfigurácia",
+ "commandGetVersion": "Získať verziu",
+ "commandFirmwareUpdate": "Aktualizovať firmvér",
+ "commandSetConnection": "Nastaviť spojenie",
+ "commandSetOdometer": "Nastaviť kilometrovník",
+ "commandGetModemStatus": "Získať stav modemu",
+ "commandGetDeviceStatus": "Získať stav zariadenia",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekvencia",
+ "commandTimezone": "Časová zóna Offset",
+ "commandMessage": "Správa",
+ "commandRadius": "Polomer",
+ "commandEnable": "Povoliť",
+ "commandData": "Dáta",
+ "commandIndex": "Index",
+ "commandPhone": "Telefónne číslo",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Všetky akcie",
+ "eventDeviceOnline": "Stav online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Stav offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Zariadenie sa hýbe",
+ "eventDeviceStopped": "Zariadenie zastavilo",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Výsledok príkazu",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Upozornenie",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Vyžaduje sa údržba",
+ "eventTextMessage": "Prijatá textová správa",
+ "eventDriverChanged": "Zmena vodiča",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Všeobecné",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibrácia",
+ "alarmMovement": "Pobyb",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Prekročenie rýchlosti",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Slabý prúd",
+ "alarmLowBattery": "Slabá batéria",
+ "alarmFault": "Chyba",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Zamknúť",
+ "alarmUnlock": "Odomknúť",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Napájanie obnovené",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Teplota",
+ "alarmParking": "Parkovanie",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Typ notifikácie",
+ "notificationAlways": "Všetky zariadenia",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Cesta",
+ "reportEvents": "Udalosti",
+ "reportTrips": "Cesty",
+ "reportStops": "Zastávky",
+ "reportSummary": "Zhrnutie",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Graf",
+ "reportConfigure": "Konfigurácia",
+ "reportEventTypes": "Typy udalstí",
+ "reportChartType": "Typ grafu",
+ "reportShowMarkers": "Zobraziť značky",
+ "reportExport": "Export",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Vlastné",
+ "reportToday": "Dnes",
+ "reportYesterday": "Včera",
+ "reportThisWeek": "Tento týždeň",
+ "reportPreviousWeek": "Minulý týždeň",
+ "reportThisMonth": "Tento mesiac",
+ "reportPreviousMonth": "Minulý mesiac",
+ "reportDeviceName": "Meno zariadenia",
+ "reportAverageSpeed": "Priemerná rýchlosť",
+ "reportMaximumSpeed": "Maximálna rýchlosť",
+ "reportEngineHours": "Prevádzkové hodiny motora",
+ "reportDuration": "Trvanie",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Čas spustenia",
+ "reportStartAddress": "Počiatočná adresa",
+ "reportEndTime": "Čas ukončenia",
+ "reportEndAddress": "Koncová adresa",
+ "reportSpentFuel": "Spotrebované palivo",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Štatistika",
+ "statisticsCaptureTime": "Zachyť čas",
+ "statisticsActiveUsers": "Aktívny používatelia",
+ "statisticsActiveDevices": "Aktívne zariadenia",
+ "statisticsRequests": "Požiadavka",
+ "statisticsMessagesReceived": "Správa doručená",
+ "statisticsMessagesStored": "Správa uložená",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Šípka",
+ "categoryDefault": "Základné",
+ "categoryAnimal": "Zviera",
+ "categoryBicycle": "Bicykel",
+ "categoryBoat": "Loď",
+ "categoryBus": "Autobus",
+ "categoryCar": "Auto",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Žeriav",
+ "categoryHelicopter": "Helikoptéra",
+ "categoryMotorcycle": "Motocykel",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Osoba",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Lietadlo",
+ "categoryShip": "Loď",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Nákladné auto",
+ "categoryVan": "Dodávka",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/sl.json b/legacy/web/l10n/sl.json
new file mode 100644
index 00000000..3c55e91b
--- /dev/null
+++ b/legacy/web/l10n/sl.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Nalagam...",
+ "sharedHide": "Skrij",
+ "sharedSave": "Shrani",
+ "sharedUpload": "Naloži",
+ "sharedSet": "Nastavi",
+ "sharedCancel": "Prekini",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Dodaj",
+ "sharedEdit": "Uredi",
+ "sharedRemove": "Odstrani",
+ "sharedRemoveConfirm": "Odstranim zapis?",
+ "sharedNoData": "Ni podatkov",
+ "sharedSubject": "Subject",
+ "sharedYes": "Da",
+ "sharedNo": "Ne",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Ura",
+ "sharedMinute": "Minuta",
+ "sharedSecond": "Sekunda",
+ "sharedDays": "dni",
+ "sharedHours": "ur",
+ "sharedMinutes": "minut",
+ "sharedDecimalDegrees": "Decimalne stopinje",
+ "sharedDegreesDecimalMinutes": "Stopinje Decimalne Minute",
+ "sharedDegreesMinutesSeconds": "Stopinje Minute Sekunde",
+ "sharedName": "Ime",
+ "sharedDescription": "Opis",
+ "sharedSearch": "Išči",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Omejeno območje",
+ "sharedGeofences": "Omejena območja",
+ "sharedCreateGeofence": "Ustvari omejeno območje",
+ "sharedNotifications": "Obvestila",
+ "sharedNotification": "Obvestilo",
+ "sharedAttributes": "Atributi",
+ "sharedAttribute": "Atribut",
+ "sharedDrivers": "Vozniki",
+ "sharedDriver": "Voznik",
+ "sharedArea": "Območje",
+ "sharedSound": "Zvok obvestila",
+ "sharedType": "Tip",
+ "sharedDistance": "Razdalja",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Pridobi stanje zemljevida",
+ "sharedComputedAttribute": "Izračunan atribut",
+ "sharedComputedAttributes": "Izračunani atributi",
+ "sharedCheckComputedAttribute": "Preveri izračunan atribut",
+ "sharedExpression": "Izraz",
+ "sharedDevice": "Naprava",
+ "sharedTest": "Preizkus",
+ "sharedTestNotification": "Pošlji testno obvestilo",
+ "sharedTestNotificators": "Preizkusi kanale",
+ "sharedTestExpression": "Preizkusi izraz",
+ "sharedCalendar": "Koledar",
+ "sharedCalendars": "Koledarji",
+ "sharedFile": "Datoteka",
+ "sharedSearchDevices": "Išči po napravah",
+ "sharedSortBy": "Razvrsti po",
+ "sharedFilterMap": "Filtriraj na zemljevidu",
+ "sharedSelectFile": "Izberi datoteko",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Obvezno",
+ "sharedPreferences": "Nastavitve",
+ "sharedPermissions": "Dovoljenja",
+ "sharedConnections": "Povezave",
+ "sharedExtra": "Dodatno",
+ "sharedPrimary": "Primarno",
+ "sharedSecondary": "Sekundarno",
+ "sharedTypeString": "Tekst",
+ "sharedTypeNumber": "Številka",
+ "sharedTypeBoolean": "Binarna vrednost",
+ "sharedTimezone": "Časovni pas",
+ "sharedInfoTitle": "Informacije",
+ "sharedSavedCommand": "Shrani ukaz",
+ "sharedSavedCommands": "Shranjeni ukazi",
+ "sharedNew": "Nov...",
+ "sharedShowAddress": "Prikaži naslov",
+ "sharedShowDetails": "Več podrobnosti",
+ "sharedDisabled": "Onemogočen",
+ "sharedMaintenance": "Vzdrževanje",
+ "sharedDeviceAccumulators": "Seštevki",
+ "sharedAlarms": "Alarmi",
+ "sharedLocation": "Lokacija",
+ "sharedImport": "Uvozi",
+ "sharedColumns": "Stolpci",
+ "sharedDropzoneText": "Povlecite in spustite datoteko sem ali kliknite",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Preprost",
+ "calendarRecurrence": "Ponovitev",
+ "calendarOnce": "Enkrat",
+ "calendarDaily": "Dnevno",
+ "calendarWeekly": "Tedensko",
+ "calendarMonthly": "Mesečno",
+ "calendarDays": "Dnevi",
+ "calendarSunday": "Nedelja",
+ "calendarMonday": "Ponedeljek",
+ "calendarTuesday": "Torek",
+ "calendarWednesday": "Sreda",
+ "calendarThursday": "Četrtek",
+ "calendarFriday": "Petek",
+ "calendarSaturday": "Sobota",
+ "attributeShowGeofences": "Prikaži omejena območja",
+ "attributeSpeedLimit": "Omejitev hitrosti",
+ "attributeFuelDropThreshold": "Mejna vrednost padca goriva",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Poročilo: Prezri stanje števca",
+ "attributeWebReportColor": "Splet: Barva poročila",
+ "attributeDevicePassword": "Geslo naprave",
+ "attributeDeviceImage": "Slika naprave",
+ "attributeDeviceInactivityStart": "Začetek neaktivnosti naprave",
+ "attributeDeviceInactivityPeriod": "Obdobje neaktivnosti naprave",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "Barva",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Podatki v pojavnem oknu",
+ "errorTitle": "Napaka",
+ "errorGeneral": "Neveljavni parametri ali kršitev omejitve",
+ "errorConnection": "Napaka v povezavi",
+ "errorSocket": "Napaka v povezavi web socket",
+ "errorZero": "Ne sme biti 0",
+ "userEmail": "E-Pošta",
+ "userPassword": "Geslo",
+ "userAdmin": "Admin",
+ "userRemember": "Zapomni si",
+ "userExpirationTime": "Poteče",
+ "userDeviceLimit": "Omejitev naprav",
+ "userUserLimit": "Omejitev uporabnikov",
+ "userDeviceReadonly": "Naprava samo za branje",
+ "userLimitCommands": "Omeji ukaze",
+ "userDisableReports": "Onemogoči poročila",
+ "userFixedEmail": "Prepreči spremembo e-pošte",
+ "userToken": "Žeton",
+ "userDeleteAccount": "Izbriši račun",
+ "userTemporary": "Temporary",
+ "loginTitle": "Prijava",
+ "loginLanguage": "Jezik",
+ "loginReset": "Ponastavi geslo",
+ "loginRegister": "Registracija",
+ "loginLogin": "Prijava",
+ "loginOpenId": "Prijavi se z OpenID",
+ "loginFailed": "Nepravilna e-pošta ali geslo",
+ "loginCreated": "Nov uporabnik je registriran",
+ "loginResetSuccess": "Prosimo preverite svojo e-pošto",
+ "loginUpdateSuccess": "Novo geslo je shranjeno",
+ "loginLogout": "Odjava",
+ "loginLogo": "Logotip",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Naprava in stanje",
+ "deviceSelected": "Izbrana naprava",
+ "deviceTitle": "Naprave",
+ "devicePrimaryInfo": "Naslov naprave",
+ "deviceSecondaryInfo": "Podrobnosti naprave",
+ "deviceIdentifier": "Identifikacija",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategorija",
+ "deviceLastUpdate": "Zadnja posodobitev",
+ "deviceCommand": "Ukaz",
+ "deviceFollow": "Sledi",
+ "deviceTotalDistance": "Skupna razdalja",
+ "deviceStatus": "Stanje",
+ "deviceStatusOnline": "Povezan",
+ "deviceStatusOffline": "Nepovezan",
+ "deviceStatusUnknown": "Neznano",
+ "deviceRegisterFirst": "Vnesite svojo prvo napravo",
+ "deviceIdentifierHelp": "IMEI, serijska številka ali druga identifikacija. Se mora ujemati z identifikacijo ki jo naprava pošilja na strežnik.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Skupina",
+ "groupParent": "Skupina",
+ "groupNoGroup": "Ni skupine",
+ "settingsTitle": "Nastavitve",
+ "settingsUser": "Račun",
+ "settingsGroups": "Skupine",
+ "settingsServer": "Strežnik",
+ "settingsUsers": "Uporabniki",
+ "settingsDistanceUnit": "Enota za razdaljo",
+ "settingsAltitudeUnit": "Enota za nadmorsko višino",
+ "settingsSpeedUnit": "Enota za hitrost",
+ "settingsVolumeUnit": "Enota za volumen",
+ "settingsTwelveHourFormat": "12-urni format",
+ "settingsCoordinateFormat": "Format koordinat",
+ "settingsServerVersion": "Različica strežnika",
+ "settingsAppVersion": "Različica aplikacije",
+ "settingsConnection": "Povezava",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "Na voljo je posodobitev.",
+ "settingsSupport": "Support",
+ "reportTitle": "Poročila",
+ "reportScheduled": "Načrtovana poročila",
+ "reportDevice": "Naprava",
+ "reportGroup": "Skupina",
+ "reportFrom": "Od",
+ "reportTo": "Do",
+ "reportShow": "Prikaži",
+ "reportClear": "Očisti",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Čas določitve",
+ "positionDeviceTime": "Čas naprave",
+ "positionServerTime": "Čas strežnika",
+ "positionValid": "Veljavnost",
+ "positionAccuracy": "Natančnost",
+ "positionLatitude": "Širina",
+ "positionLongitude": "Dolžina",
+ "positionAltitude": "Višina",
+ "positionSpeed": "Hitrost",
+ "positionCourse": "Smer",
+ "positionAddress": "Naslov",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Razdalja",
+ "positionRpm": "Obrati",
+ "positionFuel": "Gorivo",
+ "positionPower": "Napajanje",
+ "positionBattery": "Baterija",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Sateliti",
+ "positionSatVisible": "Vidni sateliti",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Gostovanje",
+ "positionEvent": "Dogodek",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Stanje",
+ "positionOdometer": "Stanje števca",
+ "positionServiceOdometer": "Servisni števec",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Ur",
+ "positionSteps": "Koraki",
+ "positionInput": "Vnos",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Izhod",
+ "positionBatteryLevel": "Nivo baterije",
+ "positionFuelConsumption": "Poraba goriva",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Kontakt",
+ "positionFlags": "Zastavice",
+ "positionCharge": "Polnjenje",
+ "positionIp": "IP",
+ "positionArchive": "Arhiv",
+ "positionVin": "VIN",
+ "positionApproximate": "Približno",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Gibanje",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Pospeševanje",
+ "positionTemp": "Temperatura",
+ "positionDeviceTemp": "Temperatura naprave",
+ "positionCoolantTemp": "Temperatura hladilne tekočine",
+ "positionOperator": "Operater",
+ "positionCommand": "Ukaz",
+ "positionBlocked": "Blokirano",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD hitrost",
+ "positionObdOdometer": "OBD Stanje števca",
+ "positionDrivingTime": "Čas vožnje",
+ "positionDriverUniqueId": "Unikatna identifikacija voznika",
+ "positionCard": "Card",
+ "positionImage": "Slika",
+ "positionVideo": "Video",
+ "positionAudio": "Zvok",
+ "serverTitle": "Nastavitve strežnika",
+ "serverZoom": "Povečava",
+ "serverRegistration": "Registracija",
+ "serverReadonly": "Samo za branje",
+ "serverForceSettings": "Vsili nastavitve",
+ "serverAnnouncement": "Obvestilo",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Zemljevid",
+ "mapActive": "Aktivni zemljevidi",
+ "mapOverlay": "Podatkovna plast",
+ "mapOverlayCustom": "Podatkovna plast po meri",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Zemljevidi",
+ "mapCustom": "Po meri (XYZ)",
+ "mapCustomArcgis": "Po meri (ArcGIS)",
+ "mapCustomLabel": "Zemljevid po meri",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Ključ",
+ "mapBingRoad": "Bing Maps Ceste",
+ "mapBingAerial": "Bing Maps Satelit",
+ "mapBingHybrid": "Bing zemljevid hibrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex zemljevid",
+ "mapYandexSat": "Yandex satelit",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Poligon",
+ "mapShapeCircle": "Krog",
+ "mapShapePolyline": "Polyline",
+ "mapLiveRoutes": "Žive poti",
+ "mapDirection": "Prikaži smer",
+ "mapCurrentLocation": "Trenutna lokacija",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Združevanje oznak",
+ "mapOnSelect": "Ob izbiri prikaži zemljevid",
+ "mapDefault": "Privzet zemljevid",
+ "stateTitle": "Stanje",
+ "stateName": "Parameter",
+ "stateValue": "Vrednost",
+ "commandTitle": "Ukaz",
+ "commandSend": "Pošlji",
+ "commandSent": "Ukaz poslan",
+ "commandQueued": "Ukaz v čakalni vrsti",
+ "commandUnit": "Naprava",
+ "commandCustom": "Ukaz po meri",
+ "commandDeviceIdentification": "Identifikacija naprave",
+ "commandPositionSingle": "Single Reporting",
+ "commandPositionPeriodic": "Periodično poročanje",
+ "commandPositionStop": "Ustavi poročanje",
+ "commandEngineStop": "Ugasni motor",
+ "commandEngineResume": "Prižgi motor",
+ "commandAlarmArm": "Vklopi alarm",
+ "commandAlarmDisarm": "Izklopi alarm",
+ "commandAlarmDismiss": "Utišaj alarm",
+ "commandSetTimezone": "Nastavi časovni pas",
+ "commandRequestPhoto": "Zahtevaj sliko",
+ "commandPowerOff": "Izklopi napravo",
+ "commandRebootDevice": "Ponovno zaženi napravo",
+ "commandFactoryReset": "Tovarniške nastavitve",
+ "commandSendSms": "Pošlji SMS",
+ "commandSendUssd": "Pošlji USSD",
+ "commandSosNumber": "Nastavi SOS številko",
+ "commandSilenceTime": "Set Silence Time",
+ "commandSetPhonebook": "Set Phonebook",
+ "commandVoiceMessage": "Glasovno sporočilo",
+ "commandOutputControl": "Output Control",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Nastavi AGPS",
+ "commandSetIndicator": "Set Indicator",
+ "commandConfiguration": "Nastavitve",
+ "commandGetVersion": "Pridobi različico",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Nastavi povezavo",
+ "commandSetOdometer": "Nastavi stanje števca",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekvenca",
+ "commandTimezone": "Timezone Offset",
+ "commandMessage": "Sporočilo",
+ "commandRadius": "Radij",
+ "commandEnable": "Omogoči",
+ "commandData": "Podatki",
+ "commandIndex": "Index",
+ "commandPhone": "Telefonska številka",
+ "commandServer": "Strežnik",
+ "commandPort": "Vrata",
+ "eventAll": "Vsi dogodki",
+ "eventDeviceOnline": "Stanje: povezan",
+ "eventDeviceUnknown": "Neznano stanje",
+ "eventDeviceOffline": "Stanje: nepovezan",
+ "eventDeviceInactive": "Naprava neaktivna",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Naprava se premika",
+ "eventDeviceStopped": "Naprava se je ustavila",
+ "eventDeviceOverspeed": "Omejitev hitrosti prekoračena",
+ "eventDeviceFuelDrop": "Padec goriva",
+ "eventDeviceFuelIncrease": "Povečanje goriva",
+ "eventCommandResult": "Rezultat ukaza",
+ "eventGeofenceEnter": "Vstopil v omejeno območje",
+ "eventGeofenceExit": "Izšel iz omejenega območja",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Vžig",
+ "eventIgnitionOff": "Vžig izključen",
+ "eventMaintenance": "Potrebno vzdrževanje",
+ "eventTextMessage": "Sporočilo sprejeto",
+ "eventDriverChanged": "Sprememba voznika",
+ "eventMedia": "Mediji",
+ "eventsScrollToLast": "Pomakni se na zadnje",
+ "eventsSoundEvents": "Zvok dogodka",
+ "eventsSoundAlarms": "Zvok alarma",
+ "alarmGeneral": "Splošno",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibracije",
+ "alarmMovement": "Premikanje",
+ "alarmLowspeed": "Nizka hitrost",
+ "alarmOverspeed": "Prekoračitev hitrosti",
+ "alarmFallDown": "Padec",
+ "alarmLowPower": "Nizka napetost napajanja",
+ "alarmLowBattery": "Baterija skoraj izpraznjena",
+ "alarmFault": "Napaka",
+ "alarmPowerOff": "Izklop",
+ "alarmPowerOn": "Vklop",
+ "alarmDoor": "Vrata",
+ "alarmLock": "Zakleni",
+ "alarmUnlock": "Odkleni",
+ "alarmGeofence": "Omejeno območje",
+ "alarmGeofenceEnter": "Vstop v omejeno območje",
+ "alarmGeofenceExit": "Izhod iz omejenega območja",
+ "alarmGpsAntennaCut": "GPS Antena prekinjena",
+ "alarmAccident": "Nesreča",
+ "alarmTow": "Vleka",
+ "alarmIdle": "Neaktiven",
+ "alarmHighRpm": "Visoki obrati",
+ "alarmHardAcceleration": "Močno pospeševanje",
+ "alarmHardBraking": "Močno zaviranje",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Prekinitev napajanja",
+ "alarmPowerRestored": "Napajanje obnovljeno",
+ "alarmJamming": "Motnja",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Parkiranje",
+ "alarmBonnet": "Pokrov motorja",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Odstranjujem",
+ "notificationType": "Tip obvestil",
+ "notificationAlways": "Vse naprave",
+ "notificationNotificators": "Kanali",
+ "notificatorCommand": "Ukaz",
+ "notificatorWeb": "Splet",
+ "notificatorMail": "Elektronska pošta",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Ponovi",
+ "reportCombined": "Kombinirano",
+ "reportRoute": "Pot",
+ "reportEvents": "Dogodki",
+ "reportTrips": "Poti",
+ "reportStops": "Postanki",
+ "reportSummary": "Povzetek",
+ "reportDaily": "Dnevni povzetek",
+ "reportChart": "Graf",
+ "reportConfigure": "Nastavi",
+ "reportEventTypes": "Tipi dogodkov",
+ "reportChartType": "Tip grafa",
+ "reportShowMarkers": "Prikaži oznake",
+ "reportExport": "Izvozi",
+ "reportEmail": "Pošlji po e-pošti",
+ "reportSchedule": "Urnik",
+ "reportPeriod": "Obdobje",
+ "reportCustom": "Poljubno",
+ "reportToday": "Danes",
+ "reportYesterday": "Včeraj",
+ "reportThisWeek": "Ta teden",
+ "reportPreviousWeek": "Prejšnji teden",
+ "reportThisMonth": "Ta mesec",
+ "reportPreviousMonth": "Prejšnji mesec",
+ "reportDeviceName": "Ime naprave",
+ "reportAverageSpeed": "Povprečna hitrost",
+ "reportMaximumSpeed": "Najvišja hitrost",
+ "reportEngineHours": "Motorinh ur",
+ "reportDuration": "Trajanje",
+ "reportStartDate": "Datum začetka",
+ "reportStartTime": "Začetni čas",
+ "reportStartAddress": "Začetni naslov",
+ "reportEndTime": "Končni čas",
+ "reportEndAddress": "Končni naslov",
+ "reportSpentFuel": "Porabljeno gorivo",
+ "reportStartOdometer": "Začetno stanje števca",
+ "reportEndOdometer": "Končno stanje števca",
+ "statisticsTitle": "Statistika",
+ "statisticsCaptureTime": "Začetni čas",
+ "statisticsActiveUsers": "Aktivni uporabniki",
+ "statisticsActiveDevices": "Aktivne naprave",
+ "statisticsRequests": "Zahtevkov",
+ "statisticsMessagesReceived": "Prejetih sporočil",
+ "statisticsMessagesStored": "Shranjenih sporočil",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Puščica",
+ "categoryDefault": "Privzeto",
+ "categoryAnimal": "Žival",
+ "categoryBicycle": "Kolo",
+ "categoryBoat": "Čoln",
+ "categoryBus": "Avtobus",
+ "categoryCar": "Avto",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Žerjav",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motor",
+ "categoryOffroad": "Terenec",
+ "categoryPerson": "Oseba",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Letalo",
+ "categoryShip": "Ladja",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Vlak",
+ "categoryTram": "Tramvaj",
+ "categoryTrolleybus": "Trolejbus",
+ "categoryTruck": "Tovornjak",
+ "categoryVan": "Kombi",
+ "categoryScooter": "Skuter",
+ "maintenanceStart": "Začetek",
+ "maintenancePeriod": "Obdobje"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/sq.json b/legacy/web/l10n/sq.json
new file mode 100644
index 00000000..8b77004a
--- /dev/null
+++ b/legacy/web/l10n/sq.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Ngarkim…",
+ "sharedHide": "Hide",
+ "sharedSave": "Ruaj",
+ "sharedUpload": "Upload",
+ "sharedSet": "Set",
+ "sharedCancel": "Anullim",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Shto",
+ "sharedEdit": "Ndrysho",
+ "sharedRemove": "Hiq",
+ "sharedRemoveConfirm": "Hiq skedarin",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "km",
+ "sharedMi": "Milje",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "Nyje",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Orë",
+ "sharedMinute": "Minuta",
+ "sharedSecond": "Sekonda",
+ "sharedDays": "days",
+ "sharedHours": "hours",
+ "sharedMinutes": "minutes",
+ "sharedDecimalDegrees": "Decimal Degrees",
+ "sharedDegreesDecimalMinutes": "Degrees Decimal Minutes",
+ "sharedDegreesMinutesSeconds": "Degrees Minutes Seconds",
+ "sharedName": "Emri",
+ "sharedDescription": "Description",
+ "sharedSearch": "Kërkim",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Geofence",
+ "sharedGeofences": "Geofences",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Notifications",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "Attributes",
+ "sharedAttribute": "Attribute",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
+ "sharedArea": "Area",
+ "sharedSound": "Notification Sound",
+ "sharedType": "Type",
+ "sharedDistance": "Distance",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Get Map State",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "Expression",
+ "sharedDevice": "Device",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send Test Notification",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Calendar",
+ "sharedCalendars": "Calendars",
+ "sharedFile": "File",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Select File",
+ "sharedPhone": "Phone",
+ "sharedRequired": "Required",
+ "sharedPreferences": "Preferences",
+ "sharedPermissions": "Permissions",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Number",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Timezone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Speed Limit",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Report: Ignore Odometer",
+ "attributeWebReportColor": "Web: Report Color",
+ "attributeDevicePassword": "Device Password",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "Color",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Gabim",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "Gabim lidhjeje",
+ "errorSocket": "Web socket connection error",
+ "errorZero": "Can't be zero",
+ "userEmail": "Email",
+ "userPassword": "Fjalëkalimi",
+ "userAdmin": "Administratori",
+ "userRemember": "Remember",
+ "userExpirationTime": "Expiration",
+ "userDeviceLimit": "Device Limit",
+ "userUserLimit": "User Limit",
+ "userDeviceReadonly": "Device Readonly",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Hyrje",
+ "loginLanguage": "Gjuha",
+ "loginReset": "Reset Password",
+ "loginRegister": "Regjistrim",
+ "loginLogin": "Lidhu",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Adresë Email-i ose fjalëkalim i gabuar",
+ "loginCreated": "Përdoruesi i ri u regjistrua",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Shkëputu",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Gjendja e pajisjeve",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Pajisjet",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifikues",
+ "deviceModel": "Model",
+ "deviceContact": "Contact",
+ "deviceCategory": "Category",
+ "deviceLastUpdate": "Përditësimi i fundit",
+ "deviceCommand": "Komandë",
+ "deviceFollow": "Ndjek",
+ "deviceTotalDistance": "Total Distance",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Unknown",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Grup",
+ "groupParent": "Grup",
+ "groupNoGroup": "Pa Grup",
+ "settingsTitle": "Parametra",
+ "settingsUser": "Llogari",
+ "settingsGroups": "Grupe",
+ "settingsServer": "Rrjeti",
+ "settingsUsers": "Përdorues",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "Formë 12-orëshe",
+ "settingsCoordinateFormat": "Coordinates Format",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Raporte",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Pajisje",
+ "reportGroup": "Group",
+ "reportFrom": "Nga",
+ "reportTo": "Tek",
+ "reportShow": "Shfaqje",
+ "reportClear": "Pastrim",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "I vlefshëm",
+ "positionAccuracy": "Accuracy",
+ "positionLatitude": "Gjerësi Gjeografike",
+ "positionLongitude": "Gjatësi Gjeografike",
+ "positionAltitude": "Lartësia",
+ "positionSpeed": "Shpejtësia",
+ "positionCourse": "Itinerari (Rruga)",
+ "positionAddress": "Adresa",
+ "positionProtocol": "Protokolli",
+ "positionDistance": "Distance",
+ "positionRpm": "RPM",
+ "positionFuel": "Fuel",
+ "positionPower": "Power",
+ "positionBattery": "Battery",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Event",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hours",
+ "positionSteps": "Steps",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Battery Level",
+ "positionFuelConsumption": "Fuel Consumption",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Ignition",
+ "positionFlags": "Flags",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Motion",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Device Temperature",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Command",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Server-Parametrat",
+ "serverZoom": "Fokus",
+ "serverRegistration": "Regjistrim",
+ "serverReadonly": "Vetëm për lexim",
+ "serverForceSettings": "Force Settings",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Harta",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Zgjedhje harte",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polygon",
+ "mapShapeCircle": "Circle",
+ "mapShapePolyline": "Polyline",
+ "mapLiveRoutes": "Live Routes",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Gjëndja",
+ "stateName": "Atribut",
+ "stateValue": "Vlera",
+ "commandTitle": "Komandë",
+ "commandSend": "Dërgo",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "Njësi",
+ "commandCustom": "Custom command",
+ "commandDeviceIdentification": "Device Identification",
+ "commandPositionSingle": "Single Reporting",
+ "commandPositionPeriodic": "Raporte periodike",
+ "commandPositionStop": "Ndalo raportin",
+ "commandEngineStop": "Ndalo punën",
+ "commandEngineResume": "Rinis",
+ "commandAlarmArm": "Arm Alarm",
+ "commandAlarmDisarm": "Disarm Alarm",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Set Timezone",
+ "commandRequestPhoto": "Request Photo",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Reboot Device",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Send SMS",
+ "commandSendUssd": "Send USSD",
+ "commandSosNumber": "Set SOS Number",
+ "commandSilenceTime": "Set Silence Time",
+ "commandSetPhonebook": "Set Phonebook",
+ "commandVoiceMessage": "Voice Message",
+ "commandOutputControl": "Output Control",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Set Indicator",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Frekuenca",
+ "commandTimezone": "Timezone Offset",
+ "commandMessage": "Message",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Data",
+ "commandIndex": "Index",
+ "commandPhone": "Phone Number",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "All Events",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Command result",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Maintenance required",
+ "eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Type of Notification",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Route",
+ "reportEvents": "Events",
+ "reportTrips": "Trips",
+ "reportStops": "Stops",
+ "reportSummary": "Summary",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Chart",
+ "reportConfigure": "Configure",
+ "reportEventTypes": "Event Types",
+ "reportChartType": "Chart Type",
+ "reportShowMarkers": "Show Markers",
+ "reportExport": "Export",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "Device Name",
+ "reportAverageSpeed": "Average Speed",
+ "reportMaximumSpeed": "Maximum Speed",
+ "reportEngineHours": "Engine Hours",
+ "reportDuration": "Duration",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Start Time",
+ "reportStartAddress": "Start Address",
+ "reportEndTime": "End Time",
+ "reportEndAddress": "End Address",
+ "reportSpentFuel": "Spent Fuel",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Statistics",
+ "statisticsCaptureTime": "Capture Time",
+ "statisticsActiveUsers": "Active Users",
+ "statisticsActiveDevices": "Active Devices",
+ "statisticsRequests": "Requests",
+ "statisticsMessagesReceived": "Messages Received",
+ "statisticsMessagesStored": "Messages Stored",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Arrow",
+ "categoryDefault": "Default",
+ "categoryAnimal": "Animal",
+ "categoryBicycle": "Bicycle",
+ "categoryBoat": "Boat",
+ "categoryBus": "Bus",
+ "categoryCar": "Car",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "Motorcycle",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Plane",
+ "categoryShip": "Ship",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Truck",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/sr.json b/legacy/web/l10n/sr.json
new file mode 100644
index 00000000..a23fc3ee
--- /dev/null
+++ b/legacy/web/l10n/sr.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Učitavanje...",
+ "sharedHide": "Sakrij",
+ "sharedSave": "Sačuvaj",
+ "sharedUpload": "Učitaj",
+ "sharedSet": "Podesi",
+ "sharedCancel": "Odustani",
+ "sharedCopy": "Kopiraj",
+ "sharedAdd": "Dodaj",
+ "sharedEdit": "Podesi",
+ "sharedRemove": "Ukloni",
+ "sharedRemoveConfirm": "Ukloniti jedinicu?",
+ "sharedNoData": "Nema podataka",
+ "sharedSubject": "Tema",
+ "sharedYes": "Da",
+ "sharedNo": "Ne",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Čas",
+ "sharedMinute": "Minut",
+ "sharedSecond": "Sekunda",
+ "sharedDays": "dana",
+ "sharedHours": "sata/i",
+ "sharedMinutes": "minuta",
+ "sharedDecimalDegrees": "Decimalni Stepeni",
+ "sharedDegreesDecimalMinutes": "Minuti Decimalnih stepeni",
+ "sharedDegreesMinutesSeconds": "Sekunde decimalnih stepeni",
+ "sharedName": "Ime",
+ "sharedDescription": "Opis",
+ "sharedSearch": "Traži",
+ "sharedIconScale": "Razmera Ikonice",
+ "sharedGeofence": "Geoograda",
+ "sharedGeofences": "Geoograde",
+ "sharedCreateGeofence": "Napravi Geoogradu",
+ "sharedNotifications": "Obaveštenja",
+ "sharedNotification": "Obaveštenja",
+ "sharedAttributes": "Osobine",
+ "sharedAttribute": "Osobina",
+ "sharedDrivers": "Vozači",
+ "sharedDriver": "Vozač",
+ "sharedArea": "Oblast",
+ "sharedSound": "Zvuk Notifikacije",
+ "sharedType": "Tip",
+ "sharedDistance": "Razdaljina",
+ "sharedHourAbbreviation": "č",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "L",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Litar",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "L/h",
+ "sharedGetMapState": "Stanje mape",
+ "sharedComputedAttribute": "Izračunati atribut",
+ "sharedComputedAttributes": "Izračunati atributi",
+ "sharedCheckComputedAttribute": "Proveri Izračunati atribut",
+ "sharedExpression": "Izraz",
+ "sharedDevice": "Uređaj",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Pošalji Test Poruku",
+ "sharedTestNotificators": "Test Kanali",
+ "sharedTestExpression": "Test izraz",
+ "sharedCalendar": "Kalendar",
+ "sharedCalendars": "Kalendari",
+ "sharedFile": "Fajl",
+ "sharedSearchDevices": "Pretraži uređaje",
+ "sharedSortBy": "Poređaj po",
+ "sharedFilterMap": "Filter na Mapi",
+ "sharedSelectFile": "Odaberi fajl",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Obavezno",
+ "sharedPreferences": "Podešavanja",
+ "sharedPermissions": "Dozvole",
+ "sharedConnections": "Konekcije",
+ "sharedExtra": "Dodatno",
+ "sharedPrimary": "Primarno",
+ "sharedSecondary": "Sekundarni",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Broj",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Vremenska zona",
+ "sharedInfoTitle": "Informacija",
+ "sharedSavedCommand": "Sačuvana Komanda ",
+ "sharedSavedCommands": "Sačuvane komande ",
+ "sharedNew": "Nov... ",
+ "sharedShowAddress": "Prikaži adresu",
+ "sharedShowDetails": "Više detalja",
+ "sharedDisabled": "Onemogućeno",
+ "sharedMaintenance": "Održavanje",
+ "sharedDeviceAccumulators": "Akumulatori",
+ "sharedAlarms": "Alarmi",
+ "sharedLocation": "Lokacija",
+ "sharedImport": "Uvoz",
+ "sharedColumns": "Kolone",
+ "sharedDropzoneText": "Prevuci file i pusti ili klikni",
+ "sharedLogs": "Dnevnici",
+ "sharedLink": "Link",
+ "calendarSimple": "Jednostavno",
+ "calendarRecurrence": "Ponavljanje",
+ "calendarOnce": "Jednom",
+ "calendarDaily": "Dnevno",
+ "calendarWeekly": "Nedeljno",
+ "calendarMonthly": "Mesečno",
+ "calendarDays": "Dani",
+ "calendarSunday": "Nedelja",
+ "calendarMonday": "Ponedeljak",
+ "calendarTuesday": "Utorak",
+ "calendarWednesday": "Sreda",
+ "calendarThursday": "Četvrtak",
+ "calendarFriday": "Petak",
+ "calendarSaturday": "Subota",
+ "attributeShowGeofences": "Prikaži Geoograde",
+ "attributeSpeedLimit": "Ograničenje brzine",
+ "attributeFuelDropThreshold": "Granica opadanja goriva",
+ "attributeFuelIncreaseThreshold": "Granica dodavanja goriva",
+ "attributePolylineDistance": "Višelinijska udaljenost",
+ "attributeReportIgnoreOdometer": "Izveštaj: Ignoriši odometar",
+ "attributeWebReportColor": "Web: Boja izveštaja",
+ "attributeDevicePassword": "Lozinka uređaja",
+ "attributeDeviceImage": "Slika uređaja",
+ "attributeDeviceInactivityStart": "Početak neaktivnosti uređaja",
+ "attributeDeviceInactivityPeriod": "Period neaktivnosti uređaja",
+ "attributeProcessingCopyAttributes": "Proces: Kopiraj atribute",
+ "attributeColor": "Boja",
+ "attributeWebLiveRouteLength": "Web: Dužina rute",
+ "attributeWebSelectZoom": "Web:Zumiraj izabrano",
+ "attributeWebMaxZoom": "Web: Maksimalno uvećanje",
+ "attributeTelegramChatId": "Telegram čet ID",
+ "attributePushoverUserKey": "Pritisnite korisnički ključ",
+ "attributePushoverDeviceNames": "Pritisni ime uređaja",
+ "attributeMailSmtpHost": "Mail: SMTP host",
+ "attributeMailSmtpPort": "Mail: SMTP port",
+ "attributeMailSmtpStarttlsEnable": "Mail: SMTP STARTTLS Enable",
+ "attributeMailSmtpStarttlsRequired": "Mail: SMTP STARTTLS Required",
+ "attributeMailSmtpSslEnable": "Mail: SMTP SSL omogući",
+ "attributeMailSmtpSslTrust": "Mail: SMTP SSL Trust",
+ "attributeMailSmtpSslProtocols": "Mail: SMTP SSL Protokoli",
+ "attributeMailSmtpFrom": "Mail: SMTP Od",
+ "attributeMailSmtpAuth": "Mail: SMTP Auten Omogući",
+ "attributeMailSmtpUsername": "Mail: SMTP Korisničko ime",
+ "attributeMailSmtpPassword": "Mail: SMTP Lozinka",
+ "attributeUiDisableSavedCommands": "Komande",
+ "attributeUiDisableAttributes": "Kor.Int.: Onemogući atribute",
+ "attributeUiDisableGroups": "UI: Onemogući grupe",
+ "attributeUiDisableEvents": "UI:Onemogući Dogadjaje",
+ "attributeUiDisableVehicleFeatures": "KI: Onemogući Karakteristike vozila",
+ "attributeUiDisableDrivers": "UI: Onemogući Vozače",
+ "attributeUiDisableComputedAttributes": "Kor.Int. : Onemogući Izračunate atribute",
+ "attributeUiDisableCalendars": "UI: Onemogući Kalendare",
+ "attributeUiDisableMaintenance": "Korisnički interfejs: Onemogući Održavanje",
+ "attributeUiHidePositionAttributes": "KI:Sakrij poziciju atributa ",
+ "attributeUiDisableLoginLanguage": "UI: Onemogući jezik za prijavu",
+ "attributeNotificationTokens": "Tokeni obaveštenja",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Greška",
+ "errorGeneral": "Nevažeći parametri ili kršenje ograničenja",
+ "errorConnection": "Greška u konekciji",
+ "errorSocket": "Greška u konekciji",
+ "errorZero": "Ne može biti nula",
+ "userEmail": "Email",
+ "userPassword": "Lozinka",
+ "userAdmin": "Admin",
+ "userRemember": "Zapamti",
+ "userExpirationTime": "Ističe",
+ "userDeviceLimit": "Limit uređaja",
+ "userUserLimit": "Limit korisnika",
+ "userDeviceReadonly": "Uređaj readonly",
+ "userLimitCommands": "Limitiraj Komande",
+ "userDisableReports": "Onemogući izveštaje",
+ "userFixedEmail": "Nema Email promena",
+ "userToken": "Znak",
+ "userDeleteAccount": "Izbriši nalog",
+ "userTemporary": "Privremeno",
+ "loginTitle": "Prijava",
+ "loginLanguage": "Jezik",
+ "loginReset": "Resetuj Lozinku",
+ "loginRegister": "Registruj se",
+ "loginLogin": "Prijava",
+ "loginOpenId": "Prijava sa OpenID",
+ "loginFailed": "Neispravna email adresa ili lozinka",
+ "loginCreated": "Novi korisnik je registrovan",
+ "loginResetSuccess": "Proverite Vaš email",
+ "loginUpdateSuccess": "Nova lozinka je postavljena",
+ "loginLogout": "Odjava",
+ "loginLogo": "Logo",
+ "loginTotpCode": "Jednokratni kod lozinke",
+ "loginTotpKey": "Jednokratni ključ lozinke",
+ "devicesAndState": "Uređaji i Stanje ",
+ "deviceSelected": "Izabrani uređaj",
+ "deviceTitle": "Uređaji",
+ "devicePrimaryInfo": "Naziv uređaja",
+ "deviceSecondaryInfo": "Detalji uređaj",
+ "deviceIdentifier": "Identifikator",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategorija",
+ "deviceLastUpdate": "Poslednji kontakt",
+ "deviceCommand": "Komanda",
+ "deviceFollow": "Prati",
+ "deviceTotalDistance": "Ukupno rastojanje",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Dostupan",
+ "deviceStatusOffline": "Nedostupan",
+ "deviceStatusUnknown": "Nepoznato",
+ "deviceRegisterFirst": "Registruj svoj prvi uređaj",
+ "deviceIdentifierHelp": "IMEI, serijski broj, ili neki drugi ID. Mora da bude isti kao identifikator koji uređaj koristi na serveru.",
+ "deviceShare": "Podeli Uređaj",
+ "groupDialog": "Grupa",
+ "groupParent": "Grupa",
+ "groupNoGroup": "Nema grupe",
+ "settingsTitle": "Podešavanja",
+ "settingsUser": "Nalog",
+ "settingsGroups": "Grupe",
+ "settingsServer": "Server",
+ "settingsUsers": "Korisnici",
+ "settingsDistanceUnit": "Jedinica razdaljine",
+ "settingsAltitudeUnit": "Jedinica visine",
+ "settingsSpeedUnit": "Jedinica brzine",
+ "settingsVolumeUnit": "Jedinica zapremine",
+ "settingsTwelveHourFormat": "12-časovni format",
+ "settingsCoordinateFormat": "Koordinatni Format",
+ "settingsServerVersion": "Verzija servera",
+ "settingsAppVersion": "Verzija aplikacije",
+ "settingsConnection": "Konekcija",
+ "settingsDarkMode": "Taman mod",
+ "settingsTotpEnable": "Ommogući jednokratnu lozinku",
+ "settingsTotpForce": "Forsiraj jednokratnu lozinku",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Interval Ažuriranja",
+ "settingsUpdateAvailable": "Postoji novo ažuriranje",
+ "settingsSupport": "Podrška",
+ "reportTitle": "Izveštaji",
+ "reportScheduled": "Zakazani izveštaji",
+ "reportDevice": "Uređaj",
+ "reportGroup": "Grupa",
+ "reportFrom": "Od",
+ "reportTo": "Do",
+ "reportShow": "Prikaži",
+ "reportClear": "Izbriši",
+ "linkGoogleMaps": "Google Mape",
+ "linkAppleMaps": "Apple Mape",
+ "linkStreetView": "Pogled na ulicu",
+ "positionFixTime": "Vreme javljanja",
+ "positionDeviceTime": "Vreme na uređaju",
+ "positionServerTime": "Vreme na serveru",
+ "positionValid": "Ispravno",
+ "positionAccuracy": "Tačnost",
+ "positionLatitude": "Geografska širina",
+ "positionLongitude": "Geografska dužina",
+ "positionAltitude": "Visina",
+ "positionSpeed": "Brzina",
+ "positionCourse": "Pravac",
+ "positionAddress": "Adresa",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Razdaljina",
+ "positionRpm": "Obrtaji",
+ "positionFuel": "Gorivo",
+ "positionPower": "Napon",
+ "positionBattery": "Baterija",
+ "positionRaw": "Neobrađen",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Sateliti",
+ "positionSatVisible": "Vidiljivi sateliti",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roming",
+ "positionEvent": "Događaj",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Kilometar sat",
+ "positionServiceOdometer": "Servisni odometar",
+ "positionTripOdometer": "Putni odometar",
+ "positionHours": "Sati",
+ "positionSteps": "Koraci",
+ "positionInput": "Ulaz",
+ "positionHeartRate": "Otkucaj srca",
+ "positionOutput": "Izlaz",
+ "positionBatteryLevel": "Jačina baterije",
+ "positionFuelConsumption": "Ukupna potrošnja",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Verzija firmvera",
+ "positionVersionHw": "Verzija hardvera",
+ "positionIgnition": "Kontakt",
+ "positionFlags": "Oznake",
+ "positionCharge": "Punjenje",
+ "positionIp": "IP adresa",
+ "positionArchive": "Arhiva",
+ "positionVin": "Broj šasije",
+ "positionApproximate": "Približno",
+ "positionThrottle": "Gas",
+ "positionMotion": "Kretanje",
+ "positionArmed": "Naoružan",
+ "positionAcceleration": "Ubrzanje",
+ "positionTemp": "Temperatura",
+ "positionDeviceTemp": "Temperatura uređaja",
+ "positionCoolantTemp": "Temperatura antifriza",
+ "positionOperator": "Operator",
+ "positionCommand": "Komanda",
+ "positionBlocked": "Blokirano",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD brzina",
+ "positionObdOdometer": "OBD odometar",
+ "positionDrivingTime": "Vreme vožnje",
+ "positionDriverUniqueId": "Jedinstveni ID vozača",
+ "positionCard": "Kartica",
+ "positionImage": "Slika",
+ "positionVideo": "Video",
+ "positionAudio": "Zvuk",
+ "serverTitle": "Podešavanja Servera",
+ "serverZoom": "Zumiranje",
+ "serverRegistration": "Registracija",
+ "serverReadonly": "Readonly verzija",
+ "serverForceSettings": "Obavezna podešavanja",
+ "serverAnnouncement": "Objava",
+ "serverName": "Ime Servera",
+ "serverDescription": "Opis Servera",
+ "serverColorPrimary": "Osnovna Boja",
+ "serverColorSecondary": "Sekundarna Boja",
+ "serverLogo": "Logo slika",
+ "serverLogoInverted": "Obrnuta logo slika",
+ "serverChangeDisable": "Onemogući Server promene",
+ "serverDisableShare": "Onemogući deljenje vozila",
+ "mapTitle": "Mapa",
+ "mapActive": "Aktivne mape",
+ "mapOverlay": "Preklapanje mape",
+ "mapOverlayCustom": "Prilagođen prikaz",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Padavine",
+ "mapOpenWeatherPressure": "OpenWeather Pritisak",
+ "mapOpenWeatherWind": "OpenWeather Vetar",
+ "mapOpenWeatherTemperature": "OpenWeather Temperatura",
+ "mapLayer": "Vrsta Mape",
+ "mapCustom": "Prilagođeno (XYZ)",
+ "mapCustomArcgis": "Prilagođeno (ArcGIS)",
+ "mapCustomLabel": "Prilagođena mapa",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hibrid",
+ "mapGoogleSatellite": "Google Satelit",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Hibrid Mapa",
+ "mapBaidu": "Badu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Mapa",
+ "mapYandexSat": "Yandex Satelit",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Ulice",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Saobraćaj",
+ "mapTomTomIncidents": "TomTom Saobraćajni incidenti",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satelit",
+ "mapHereFlow": "Here Saobraćaj",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Višeugao",
+ "mapShapeCircle": "Krug",
+ "mapShapePolyline": "Višelinijski",
+ "mapLiveRoutes": "Validne rute",
+ "mapDirection": "Pokaži pravac",
+ "mapCurrentLocation": "Trenutna lokacija",
+ "mapPoiLayer": "POI sloj",
+ "mapClustering": "Klasterovanje markera",
+ "mapOnSelect": "Prikaži Mapu pri selekciji",
+ "mapDefault": "Osnovna mapa",
+ "stateTitle": "Stanje",
+ "stateName": "Parametar",
+ "stateValue": "Vrednost",
+ "commandTitle": "Komanda",
+ "commandSend": "Pošalji",
+ "commandSent": "Komanda poslata",
+ "commandQueued": "Komanda na čekanju",
+ "commandUnit": "Jedinica",
+ "commandCustom": "Prilagođena komanda",
+ "commandDeviceIdentification": "Identifikacija uređaja",
+ "commandPositionSingle": "Izveštaj za jednog",
+ "commandPositionPeriodic": "Periodično izveštavanje",
+ "commandPositionStop": "Prekini izveštavanja",
+ "commandEngineStop": "Zaustavi motor",
+ "commandEngineResume": "Pokreni motor",
+ "commandAlarmArm": "Omogući alarm",
+ "commandAlarmDisarm": "Onemogući alarm",
+ "commandAlarmDismiss": "Onemogući alarm",
+ "commandSetTimezone": "Podesi vremensku zonu",
+ "commandRequestPhoto": "Zahtevaj fotografiju",
+ "commandPowerOff": "Isključi uređjaj",
+ "commandRebootDevice": "Ponovo pokreni uređaj",
+ "commandFactoryReset": "Fabrički reset",
+ "commandSendSms": "Pošalji SMS",
+ "commandSendUssd": "Pošalji USSD",
+ "commandSosNumber": "Podesi SOS broj",
+ "commandSilenceTime": "Podesi nečujno vreme ",
+ "commandSetPhonebook": "Podesi kontakte",
+ "commandVoiceMessage": "Glasovna poruka",
+ "commandOutputControl": "Kontrola izlaza",
+ "commandVoiceMonitoring": "Monitoring glasa",
+ "commandSetAgps": "Podesi AGPS",
+ "commandSetIndicator": "Postavi indikator",
+ "commandConfiguration": "Konfiguracija",
+ "commandGetVersion": "Proveri verziju",
+ "commandFirmwareUpdate": "Ažuriraj firmver",
+ "commandSetConnection": "Podesi konekciju",
+ "commandSetOdometer": "Podesi odometar",
+ "commandGetModemStatus": "Zatraži status modema",
+ "commandGetDeviceStatus": "Zatraži status uređaja",
+ "commandSetSpeedLimit": "Podesi ograničenje brzine",
+ "commandModePowerSaving": "Mod čuvanja energije",
+ "commandModeDeepSleep": "Mod dubokog spavanja",
+ "commandAlarmGeofence": "Postavite alarm geoograde",
+ "commandAlarmBattery": "Podesite alarm baterije",
+ "commandAlarmSos": "Postavite SOS alarm",
+ "commandAlarmRemove": "Postavite alarm uklanjanja",
+ "commandAlarmClock": "Postavite alarm sata",
+ "commandAlarmSpeed": "Postavite alarm brzine",
+ "commandAlarmFall": "Postavite alarm padanja",
+ "commandAlarmVibration": "Postavite alarm vibracije",
+ "commandFrequency": "Frekvencija",
+ "commandTimezone": "Vremenska zona ",
+ "commandMessage": "Poruka",
+ "commandRadius": "Radius",
+ "commandEnable": "Omogući",
+ "commandData": "Podaci",
+ "commandIndex": "Lista",
+ "commandPhone": "Broj telefona",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Svi događaji",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status nepoznat",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Uređaj je neaktivan",
+ "eventQueuedCommandSent": "Komanda na čekanju",
+ "eventDeviceMoving": "Uređaj u pokretu",
+ "eventDeviceStopped": "Uređaj zaustavljen",
+ "eventDeviceOverspeed": "Granica brzine je prekoračena",
+ "eventDeviceFuelDrop": "Pad nivoa goriva",
+ "eventDeviceFuelIncrease": "Dolivanje goriva",
+ "eventCommandResult": "Stanje komande",
+ "eventGeofenceEnter": "Ulazak u geoogradu",
+ "eventGeofenceExit": "Izlazak iz geoograde",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Kontakt uključen",
+ "eventIgnitionOff": "Kontakt isključen",
+ "eventMaintenance": "Potrebno održavanje",
+ "eventTextMessage": "Tekstualma poruka primljena",
+ "eventDriverChanged": "Vozač promenjen",
+ "eventMedia": "Medija",
+ "eventsScrollToLast": "Skroluj do zadnjeg",
+ "eventsSoundEvents": "Zvuci događaja",
+ "eventsSoundAlarms": "Zvuci alarma",
+ "alarmGeneral": "Opšte",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibracija",
+ "alarmMovement": "Kretanje",
+ "alarmLowspeed": "Mala brzina",
+ "alarmOverspeed": "Prekoračenje brzine",
+ "alarmFallDown": "Pad",
+ "alarmLowPower": "Nizak napon",
+ "alarmLowBattery": "Slaba baterija",
+ "alarmFault": "Greška",
+ "alarmPowerOff": "Alarm isključen",
+ "alarmPowerOn": "Alarm uključen",
+ "alarmDoor": "Vrata",
+ "alarmLock": "Zaključan",
+ "alarmUnlock": "Otključan",
+ "alarmGeofence": "Geoograda",
+ "alarmGeofenceEnter": "Ulazak u geeogradu",
+ "alarmGeofenceExit": "Izlaz iz geoograde",
+ "alarmGpsAntennaCut": "GPS antena u prekidu",
+ "alarmAccident": "Nesreća",
+ "alarmTow": "Odvlačenje",
+ "alarmIdle": "Na čekanju",
+ "alarmHighRpm": "Visoki obrtaji",
+ "alarmHardAcceleration": "Naglo ubrzanje",
+ "alarmHardBraking": "Naglo kočenje",
+ "alarmHardCornering": "Naglo skretanje",
+ "alarmLaneChange": "Promena trake",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Nema napajanja",
+ "alarmPowerRestored": "Napajanje obnovljeno",
+ "alarmJamming": "Ometanje signala",
+ "alarmTemperature": "Temperatura",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Hauba",
+ "alarmFootBrake": "Nožna kočnica",
+ "alarmFuelLeak": "Curenje goriva",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Uklanjanje",
+ "notificationType": "Tip obaveštenja",
+ "notificationAlways": "Svi uređaji",
+ "notificationNotificators": "Kanali",
+ "notificatorCommand": "Komanda",
+ "notificatorWeb": "Internet",
+ "notificatorMail": "Pošta",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Istorija kretanja",
+ "reportCombined": "Kombinovano",
+ "reportRoute": "Ruta",
+ "reportEvents": "Događaji",
+ "reportTrips": "Vožnje",
+ "reportStops": "Zaustavljanja",
+ "reportSummary": "Izveštaj",
+ "reportDaily": "Dnevni pregled",
+ "reportChart": "Grafikon",
+ "reportConfigure": "Konfiguracija",
+ "reportEventTypes": "Tip događaja",
+ "reportChartType": "Tip grafikona",
+ "reportShowMarkers": "Pokaži markere",
+ "reportExport": "Izvezi",
+ "reportEmail": "Email Izveštaj",
+ "reportSchedule": "Zakazivanje",
+ "reportPeriod": "Period",
+ "reportCustom": "Prilagodjeno",
+ "reportToday": "Danas",
+ "reportYesterday": "Juče",
+ "reportThisWeek": "Ove nedelje",
+ "reportPreviousWeek": "Prethodna nedelja",
+ "reportThisMonth": "Ovaj mesec",
+ "reportPreviousMonth": "Prethodni mesec",
+ "reportDeviceName": "Ime uređaja",
+ "reportAverageSpeed": "Prosečna brzina",
+ "reportMaximumSpeed": "Maksimalna brzina",
+ "reportEngineHours": "Radni sati",
+ "reportDuration": "Trajanje",
+ "reportStartDate": "Početni datum",
+ "reportStartTime": "Startno vreme",
+ "reportStartAddress": "Početna adresa",
+ "reportEndTime": "Završno vreme",
+ "reportEndAddress": "Krajnja adresa",
+ "reportSpentFuel": "Potrošeno goriva",
+ "reportStartOdometer": "Odometar početak",
+ "reportEndOdometer": "Odometar kraj",
+ "statisticsTitle": "Statistika",
+ "statisticsCaptureTime": "Vreme slikanja",
+ "statisticsActiveUsers": "Aktivni korisnici",
+ "statisticsActiveDevices": "Aktivni uređaji",
+ "statisticsRequests": "Zahtevi",
+ "statisticsMessagesReceived": "Primljene poruke",
+ "statisticsMessagesStored": "Sačuvane poruke",
+ "statisticsGeocoder": "Geokoder upiti",
+ "statisticsGeolocation": "Geolokacijski upiti",
+ "categoryArrow": "Strelica",
+ "categoryDefault": "Osnovni",
+ "categoryAnimal": "Životinja",
+ "categoryBicycle": "Bicikl",
+ "categoryBoat": "Brod",
+ "categoryBus": "Autobus",
+ "categoryCar": "Auto",
+ "categoryCamper": "Kamper",
+ "categoryCrane": "Kran",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motor",
+ "categoryOffroad": "Terensko",
+ "categoryPerson": "Osoba",
+ "categoryPickup": "Pikap",
+ "categoryPlane": "Avion",
+ "categoryShip": "Brod",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Voz",
+ "categoryTram": "Tramvaj",
+ "categoryTrolleybus": "Trolejbus",
+ "categoryTruck": "Kamion",
+ "categoryVan": "Kombi",
+ "categoryScooter": "Skuter",
+ "maintenanceStart": "Početak",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/sv.json b/legacy/web/l10n/sv.json
new file mode 100644
index 00000000..e6ee943b
--- /dev/null
+++ b/legacy/web/l10n/sv.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Laddar...",
+ "sharedHide": "Göm",
+ "sharedSave": "Spara",
+ "sharedUpload": "Upload",
+ "sharedSet": "Set",
+ "sharedCancel": "Avbryt",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Lägg till",
+ "sharedEdit": "Redigera",
+ "sharedRemove": "Radera",
+ "sharedRemoveConfirm": "Radera objekt?",
+ "sharedNoData": "Data saknas",
+ "sharedSubject": "Subject",
+ "sharedYes": "Ja",
+ "sharedNo": "Nej",
+ "sharedKm": "km",
+ "sharedMi": "mi",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "tim",
+ "sharedMinute": "min",
+ "sharedSecond": "sek",
+ "sharedDays": "d",
+ "sharedHours": "tim",
+ "sharedMinutes": "min",
+ "sharedDecimalDegrees": "Decimalgrader",
+ "sharedDegreesDecimalMinutes": "Decimalgrader Minuter",
+ "sharedDegreesMinutesSeconds": "Decimalgrader Sekunder",
+ "sharedName": "Namn",
+ "sharedDescription": "Beskrivning",
+ "sharedSearch": "Sök",
+ "sharedIconScale": "Ikonskala",
+ "sharedGeofence": "Geofence",
+ "sharedGeofences": "Geofences",
+ "sharedCreateGeofence": "Skapa Geofence",
+ "sharedNotifications": "Notiser",
+ "sharedNotification": "Notis",
+ "sharedAttributes": "Attributer",
+ "sharedAttribute": "Attribut",
+ "sharedDrivers": "Förare",
+ "sharedDriver": "Förare",
+ "sharedArea": "Område",
+ "sharedSound": "Ljudnotis",
+ "sharedType": "Typ",
+ "sharedDistance": "Distans",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gallon",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp.Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Få karttillstånd",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "Uttryck",
+ "sharedDevice": "Enhet",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Skicka testnortis",
+ "sharedTestNotificators": "Testkanaler",
+ "sharedTestExpression": "Testuttryck",
+ "sharedCalendar": "Kalender",
+ "sharedCalendars": "Kalendrar",
+ "sharedFile": "Fil",
+ "sharedSearchDevices": "Sök Enheter",
+ "sharedSortBy": "Sortera efter",
+ "sharedFilterMap": "Filtrera på kartan",
+ "sharedSelectFile": "Välj fil",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Nödvändig",
+ "sharedPreferences": "Inställningar",
+ "sharedPermissions": "Rättigheter",
+ "sharedConnections": "Anslutningar",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primär",
+ "sharedSecondary": "Sekundär",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Number",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Tidszon",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Sparade kommando",
+ "sharedSavedCommands": "Sparade kommandon",
+ "sharedNew": "Ny",
+ "sharedShowAddress": "Visa Adress",
+ "sharedShowDetails": "Mer Detaljer",
+ "sharedDisabled": "Inaktiverad",
+ "sharedMaintenance": "Underhåll",
+ "sharedDeviceAccumulators": "Ackumulatorer",
+ "sharedAlarms": "Alarm",
+ "sharedLocation": "Plats",
+ "sharedImport": "Import",
+ "sharedColumns": "Kolumn",
+ "sharedDropzoneText": "Dra och släpp en fil här eller klicka",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Enkel",
+ "calendarRecurrence": "Upprepning",
+ "calendarOnce": "En gång",
+ "calendarDaily": "Dagligen",
+ "calendarWeekly": "Varje vecka",
+ "calendarMonthly": "Varje Månad",
+ "calendarDays": "Dagar",
+ "calendarSunday": "Söndag",
+ "calendarMonday": "Måndag",
+ "calendarTuesday": "Tisdag",
+ "calendarWednesday": "Onsdag",
+ "calendarThursday": "Torsdag",
+ "calendarFriday": "Fredag",
+ "calendarSaturday": "Lördag",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Hastighetsbegränsning",
+ "attributeFuelDropThreshold": "Bränsleminskningströskel",
+ "attributeFuelIncreaseThreshold": "Bränsleökningsgräns",
+ "attributePolylineDistance": "Polylinedistans",
+ "attributeReportIgnoreOdometer": "Rapport: Ignorera Odometer",
+ "attributeWebReportColor": "Web: Rapport färg",
+ "attributeDevicePassword": "Enhetslösenord",
+ "attributeDeviceImage": "Enhetsbild",
+ "attributeDeviceInactivityStart": "Enhetens inaktivitetsstart",
+ "attributeDeviceInactivityPeriod": "Enhetens inaktivitetslängd",
+ "attributeProcessingCopyAttributes": "Processing:",
+ "attributeColor": "Färg",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Webb: Maximal Zoom",
+ "attributeTelegramChatId": "Telegram Chat-ID",
+ "attributePushoverUserKey": "Pushover användarnyckel",
+ "attributePushoverDeviceNames": "Pushover Enhetsnamn",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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 Från",
+ "attributeMailSmtpAuth": "Mail: SMTP Auth Enable",
+ "attributeMailSmtpUsername": "Mail: SMTP Användarnamn",
+ "attributeMailSmtpPassword": "Mail: SMTP Lösenord",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Inaktivera attribut",
+ "attributeUiDisableGroups": "UI: Inaktivera Grupper",
+ "attributeUiDisableEvents": "UI: Inaktivera Händelser",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Inaktivera Förare",
+ "attributeUiDisableComputedAttributes": "UI: Inaktivera Beräknade Attribut",
+ "attributeUiDisableCalendars": "UI: Inaktivera Kalendrar",
+ "attributeUiDisableMaintenance": "UI: Inaktivera Underhåll",
+ "attributeUiHidePositionAttributes": "UI: Göm Positionsattribut",
+ "attributeUiDisableLoginLanguage": "UI: Inaktivera Loginspråk",
+ "attributeNotificationTokens": "Notistoken",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Fel",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "Anslutningsfel",
+ "errorSocket": "Anslutningsfel till Web socket",
+ "errorZero": "Kan inte vara noll",
+ "userEmail": "Epost",
+ "userPassword": "Lösenord",
+ "userAdmin": "Admin",
+ "userRemember": "Kom ihåg",
+ "userExpirationTime": "Utgång",
+ "userDeviceLimit": "Enhetsbegränsning",
+ "userUserLimit": "Användarbegränsning",
+ "userDeviceReadonly": "Enhet endast läsbar",
+ "userLimitCommands": "Begränsa kommandon",
+ "userDisableReports": "Inaktivera Rappporter",
+ "userFixedEmail": "Ingen förändring av Email",
+ "userToken": "Token",
+ "userDeleteAccount": "Ta bor Konto",
+ "userTemporary": "Temporary",
+ "loginTitle": "Logga in",
+ "loginLanguage": "Språk",
+ "loginReset": "Återställ Lösenord",
+ "loginRegister": "Registrera",
+ "loginLogin": "Logga in",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Felaktig epostadress eller lösenord",
+ "loginCreated": "Ny användare har blivit registrerad",
+ "loginResetSuccess": "Kontrollera din Email",
+ "loginUpdateSuccess": "Nytt lösenord är sparat",
+ "loginLogout": "Logga ut",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Enhet och tillstånd",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Enhet",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Identifierare",
+ "deviceModel": "Model",
+ "deviceContact": "Kontakt",
+ "deviceCategory": "Kategori",
+ "deviceLastUpdate": "Senast uppdaterad",
+ "deviceCommand": "Kommando",
+ "deviceFollow": "Följ",
+ "deviceTotalDistance": "Total distans",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Okänd",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Grupp",
+ "groupParent": "Grupp",
+ "groupNoGroup": "Ingen grupp",
+ "settingsTitle": "Inställningar",
+ "settingsUser": "Konto",
+ "settingsGroups": "Grupper",
+ "settingsServer": "Server",
+ "settingsUsers": "Användare",
+ "settingsDistanceUnit": "Distansenhet",
+ "settingsAltitudeUnit": "Höjdenhet",
+ "settingsSpeedUnit": "Hastighetsenhet",
+ "settingsVolumeUnit": "Volymenhet",
+ "settingsTwelveHourFormat": "12-timmars format",
+ "settingsCoordinateFormat": "Kordinatformat",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Rapport",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Enhet",
+ "reportGroup": "Grupp",
+ "reportFrom": "Från",
+ "reportTo": "Till",
+ "reportShow": "Visa",
+ "reportClear": "Rensa",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Gatuvy",
+ "positionFixTime": "Låst tid",
+ "positionDeviceTime": "Enhetstid",
+ "positionServerTime": "Servertid",
+ "positionValid": "Giltig",
+ "positionAccuracy": "Noggrannhet",
+ "positionLatitude": "Latitud",
+ "positionLongitude": "Longitud",
+ "positionAltitude": "Höjdnivå",
+ "positionSpeed": "Hastighet",
+ "positionCourse": "Kurs",
+ "positionAddress": "Adress",
+ "positionProtocol": "Protokoll",
+ "positionDistance": "Distans",
+ "positionRpm": "RPM",
+ "positionFuel": "Bränsle",
+ "positionPower": "Power",
+ "positionBattery": "Batteri",
+ "positionRaw": "Rå",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Sateliter",
+ "positionSatVisible": "Synliga sateliter",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Händelser",
+ "positionAlarm": "Larm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip",
+ "positionHours": "tim",
+ "positionSteps": "Steg",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Batteri nivå",
+ "positionFuelConsumption": "Bränsle åtgång",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware version",
+ "positionVersionHw": "Hardware version",
+ "positionIgnition": "Tändning",
+ "positionFlags": "Flaggor",
+ "positionCharge": "Laddar",
+ "positionIp": "IP",
+ "positionArchive": "Arkivera",
+ "positionVin": "VIN",
+ "positionApproximate": "Uppskattningsvis",
+ "positionThrottle": "Gasreglage",
+ "positionMotion": "Rörelse",
+ "positionArmed": "Larmad",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperatur",
+ "positionDeviceTemp": "Enhetstemperatur",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operatör",
+ "positionCommand": "Kommando",
+ "positionBlocked": "Blockerad ",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "ODB Hastighet",
+ "positionObdOdometer": "ODB Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Unikt Förar-id",
+ "positionCard": "Card",
+ "positionImage": "Bild",
+ "positionVideo": "Video",
+ "positionAudio": "Ljud",
+ "serverTitle": "Serverinställningar",
+ "serverZoom": "Zoom",
+ "serverRegistration": "Registrera",
+ "serverReadonly": "Endast läsbar",
+ "serverForceSettings": "Tvinga inställning",
+ "serverAnnouncement": "Tillkännagivande",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Karta",
+ "mapActive": "Aktiva Kartor",
+ "mapOverlay": "Kartöverlägg",
+ "mapOverlayCustom": "Specialöverlägg",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API-nyckel",
+ "mapOpenWeatherClouds": "OpenWeather Moln",
+ "mapOpenWeatherPrecipitation": "OpenWeather Nederbörd",
+ "mapOpenWeatherPressure": "OpenWeather Lufttryck",
+ "mapOpenWeatherWind": "OpenWeather Vind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperatur",
+ "mapLayer": "Kartlager",
+ "mapCustom": "Special (XYZ)",
+ "mapCustomArcgis": "Special (ArcGIS)",
+ "mapCustomLabel": "Specialkarta",
+ "mapCarto": "Carto grundkarta",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Nyckel",
+ "mapBingRoad": "Bing Maps Väg",
+ "mapBingAerial": "Bing Maps Flygfoto",
+ "mapBingHybrid": "Bing kartor hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex kartor",
+ "mapYandexSat": "Yandex satellit",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Bas",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Bas",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Bas",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Polygon",
+ "mapShapeCircle": "Cirkel",
+ "mapShapePolyline": "Polyline",
+ "mapLiveRoutes": "Liverutter",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Nuvarande position",
+ "mapPoiLayer": "POI Lager",
+ "mapClustering": "Markörssamling",
+ "mapOnSelect": "Visa karta på urval",
+ "mapDefault": "Default Map",
+ "stateTitle": "Status",
+ "stateName": "Attribut",
+ "stateValue": "Värde",
+ "commandTitle": "Kommando",
+ "commandSend": "Skicka",
+ "commandSent": "Kommando sänt",
+ "commandQueued": "Kommando i kö",
+ "commandUnit": "Enhet",
+ "commandCustom": "Anpassat kommandot",
+ "commandDeviceIdentification": "Enhetsidentifikation",
+ "commandPositionSingle": "Enkel rapportering",
+ "commandPositionPeriodic": "Periodisk rapport",
+ "commandPositionStop": "Stoppa rapportering",
+ "commandEngineStop": "Motor Stopp",
+ "commandEngineResume": "Motor Återuppta",
+ "commandAlarmArm": "Slå på larm",
+ "commandAlarmDisarm": "Slå av larm",
+ "commandAlarmDismiss": "Avvisa larm",
+ "commandSetTimezone": "Ställ in tidszon",
+ "commandRequestPhoto": "Begär fotografi",
+ "commandPowerOff": "Stäng av enheten",
+ "commandRebootDevice": "Starta om enhet",
+ "commandFactoryReset": "Fabriksåterställning",
+ "commandSendSms": "Skicka SMS",
+ "commandSendUssd": "Skicka USSD",
+ "commandSosNumber": "Ställ in SOS nummer",
+ "commandSilenceTime": "Ställ in stilleståndstid",
+ "commandSetPhonebook": "Ställ in telefonbok",
+ "commandVoiceMessage": "Typ av notis",
+ "commandOutputControl": "Utgångskontroll",
+ "commandVoiceMonitoring": "Röstövervakning",
+ "commandSetAgps": "Ställ in AGPS",
+ "commandSetIndicator": "Ställ in indikator",
+ "commandConfiguration": "Konfigurering",
+ "commandGetVersion": "Hämta version",
+ "commandFirmwareUpdate": "Uppdatera programvara",
+ "commandSetConnection": "Ställ in anslutning",
+ "commandSetOdometer": "Ställ in Odometer",
+ "commandGetModemStatus": "Hämta modemstatus",
+ "commandGetDeviceStatus": "Hämta enhetsstatus",
+ "commandSetSpeedLimit": "Ställ in hastighetsgräns",
+ "commandModePowerSaving": "Strömsparläge",
+ "commandModeDeepSleep": "Ställ in djupviloläge",
+ "commandAlarmGeofence": "Ställ in Geofencealarm",
+ "commandAlarmBattery": "Ställ in batterinivåalarm",
+ "commandAlarmSos": "Stöll in SOS-larm",
+ "commandAlarmRemove": "Ställ in Ta bort larm",
+ "commandAlarmClock": "Ställ in klockalarm",
+ "commandAlarmSpeed": "Ställ in hastighetslarm",
+ "commandAlarmFall": "Ställ in fallarm",
+ "commandAlarmVibration": "Ställ in vibrationslarm",
+ "commandFrequency": "Frekvens",
+ "commandTimezone": "Tidszon Offset",
+ "commandMessage": "Meddelande",
+ "commandRadius": "Radie",
+ "commandEnable": "Aktivera",
+ "commandData": "Data",
+ "commandIndex": "Register",
+ "commandPhone": "Telefonnummer",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Alla event",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status okänd",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Enhet inaktiverad",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Enheten i rörelse",
+ "eventDeviceStopped": "Enheten stannade",
+ "eventDeviceOverspeed": "Hastighetsgränsen överskreds",
+ "eventDeviceFuelDrop": "Bränslenivåminskning",
+ "eventDeviceFuelIncrease": "Bränslenivåökning",
+ "eventCommandResult": "Kommando resultat",
+ "eventGeofenceEnter": "Ankommit geofence",
+ "eventGeofenceExit": "Lämnat geofence",
+ "eventAlarm": "Larm",
+ "eventIgnitionOn": "Tändning påslagen",
+ "eventIgnitionOff": "Tändning avslagen",
+ "eventMaintenance": "Underhåll krävs",
+ "eventTextMessage": "Textmeddelande mottaget",
+ "eventDriverChanged": "Förarbyte",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scrolla till sista",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Generellt",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Rörelse",
+ "alarmLowspeed": "Låg hastighet",
+ "alarmOverspeed": "För hög hastighet",
+ "alarmFallDown": "Fall",
+ "alarmLowPower": "Låg effekt",
+ "alarmLowBattery": "Låg laddnivå",
+ "alarmFault": "Fel",
+ "alarmPowerOff": "Avstängd",
+ "alarmPowerOn": "Påslagen",
+ "alarmDoor": "Dörr",
+ "alarmLock": "Lås",
+ "alarmUnlock": "Lås upp",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Ankom geofence",
+ "alarmGeofenceExit": "Lämnade geofence",
+ "alarmGpsAntennaCut": "Avklippt GPS-antenn",
+ "alarmAccident": "Olycka",
+ "alarmTow": "Bogsera",
+ "alarmIdle": "På tomgång",
+ "alarmHighRpm": "Högt motorvarv",
+ "alarmHardAcceleration": "Hård acceleration",
+ "alarmHardBraking": "Hård inbromsning",
+ "alarmHardCornering": "Hård kurvtagning",
+ "alarmLaneChange": "Körfältsbyte",
+ "alarmFatigueDriving": "Trötthetskörning",
+ "alarmPowerCut": "Strömavbrott",
+ "alarmPowerRestored": "Strömmen återställd",
+ "alarmJamming": "Störning",
+ "alarmTemperature": "Temperatur",
+ "alarmParking": "Parkering",
+ "alarmBonnet": "Motorhuv",
+ "alarmFootBrake": "Fotbroms",
+ "alarmFuelLeak": "Bränsleläcka",
+ "alarmTampering": "Manupulering",
+ "alarmRemoving": "Borttagning",
+ "notificationType": "Typ av notis",
+ "notificationAlways": "Alla enheter",
+ "notificationNotificators": "Kanaler",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Webb",
+ "notificatorMail": "Emejl",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Svara",
+ "reportCombined": "Combined",
+ "reportRoute": "Rutt",
+ "reportEvents": "Händelser",
+ "reportTrips": "Resor",
+ "reportStops": "Stop",
+ "reportSummary": "Sammanfattning",
+ "reportDaily": "Daglig summering",
+ "reportChart": "Diagram",
+ "reportConfigure": "Konfigurera",
+ "reportEventTypes": "Händelsetyp",
+ "reportChartType": "Diagramtyp",
+ "reportShowMarkers": "Visa markörer",
+ "reportExport": "Export",
+ "reportEmail": "Emailrepport",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Anpassad",
+ "reportToday": "Idag",
+ "reportYesterday": "Igår",
+ "reportThisWeek": "Denna veckan",
+ "reportPreviousWeek": "Förra veckan",
+ "reportThisMonth": "Denna månaden",
+ "reportPreviousMonth": "Förra månaden",
+ "reportDeviceName": "Enhetsnamn",
+ "reportAverageSpeed": "Genomsnittshastighet",
+ "reportMaximumSpeed": "Maxhastighet",
+ "reportEngineHours": "Motortimmar",
+ "reportDuration": "Varaktighet",
+ "reportStartDate": "Startdatum",
+ "reportStartTime": "Starttid",
+ "reportStartAddress": "Startadress",
+ "reportEndTime": "Sluttid",
+ "reportEndAddress": "Slutadress",
+ "reportSpentFuel": "Förbrukat bränsle",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer Slut",
+ "statisticsTitle": "Statistik",
+ "statisticsCaptureTime": "Inspelningstid",
+ "statisticsActiveUsers": "Aktiva användare",
+ "statisticsActiveDevices": "Aktiva enheter",
+ "statisticsRequests": "Förfrågningar",
+ "statisticsMessagesReceived": "Meddelande mottaget",
+ "statisticsMessagesStored": "Meddelande lagrat",
+ "statisticsGeocoder": "Geocoder förfrågan",
+ "statisticsGeolocation": "Geolocation förfrågan",
+ "categoryArrow": "Pil",
+ "categoryDefault": "Standart",
+ "categoryAnimal": "Djur",
+ "categoryBicycle": "Cykel",
+ "categoryBoat": "Båt",
+ "categoryBus": "Buss",
+ "categoryCar": "Bil",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Kran",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motorcykel",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Person",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Flygplan",
+ "categoryShip": "Fartyg",
+ "categoryTractor": "Traktor",
+ "categoryTrain": "Täg",
+ "categoryTram": "Spårvagn",
+ "categoryTrolleybus": "Trådbuss",
+ "categoryTruck": "Lastbil",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/ta.json b/legacy/web/l10n/ta.json
new file mode 100644
index 00000000..8cdbdc62
--- /dev/null
+++ b/legacy/web/l10n/ta.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "பதிவு செய்",
+ "sharedHide": "மறை",
+ "sharedSave": "சேமி",
+ "sharedUpload": "Upload",
+ "sharedSet": "அமை",
+ "sharedCancel": "ரத்து செய்",
+ "sharedCopy": "Copy",
+ "sharedAdd": "சேர்க்க",
+ "sharedEdit": "தொகுக்க",
+ "sharedRemove": "நீக்குக",
+ "sharedRemoveConfirm": "நீக்கம் உறுதி செய்?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "கிமீ",
+ "sharedMi": "மைல்",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "கடல் மைல்",
+ "sharedKmh": "கிமீ/மணிக்கு",
+ "sharedMph": "மைல்/மணிக்கு",
+ "sharedHour": "மணி நேரம்",
+ "sharedMinute": "நிமிடம்",
+ "sharedSecond": "விநாடி",
+ "sharedDays": "நாட்கள் ",
+ "sharedHours": "மணி நேரம் ",
+ "sharedMinutes": "நிமிடங்கள்",
+ "sharedDecimalDegrees": "தசம டிகிரி",
+ "sharedDegreesDecimalMinutes": "தசம டிகிரி நிமிடங்கள்",
+ "sharedDegreesMinutesSeconds": "தசம டிகிரி நொடிகள்",
+ "sharedName": "பெயர்",
+ "sharedDescription": "விளக்கம்",
+ "sharedSearch": "தேடுக",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "பூகோள வேலி",
+ "sharedGeofences": "பூகோள வேலிகள்",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "அறிவிப்புகள்",
+ "sharedNotification": "அறிவிப்பு",
+ "sharedAttributes": "பண்புகள்",
+ "sharedAttribute": "பண்பு",
+ "sharedDrivers": "வாகன ஓட்டிகள் ",
+ "sharedDriver": "ஓட்டுநர்கள்",
+ "sharedArea": "பகுதி",
+ "sharedSound": "அறிவிப்பு ஒலி",
+ "sharedType": "வகை",
+ "sharedDistance": "தொலைவு",
+ "sharedHourAbbreviation": "ம",
+ "sharedMinuteAbbreviation": "நி",
+ "sharedSecondAbbreviation": "எஸ் ",
+ "sharedVoltAbbreviation": "வி ",
+ "sharedLiterAbbreviation": "எல் ",
+ "sharedGallonAbbreviation": "கேலன்கள்",
+ "sharedLiter": "லிட்டர்",
+ "sharedImpGallon": "கேலன்கள்",
+ "sharedUsGallon": "அமெரிக்கா கேலன்கள்",
+ "sharedLiterPerHourAbbreviation": "லிட்டர்/மணி ",
+ "sharedGetMapState": "வரைபட நிலையை பெறு",
+ "sharedComputedAttribute": "கணக்கிடப்பட்ட பண்புக்கூறு",
+ "sharedComputedAttributes": "கணக்கிடப்பட்ட பண்புக்கூறுகள்",
+ "sharedCheckComputedAttribute": "கணக்கிடப்பட்ட பண்புகளை சரிபார்க்கவும்",
+ "sharedExpression": "வெளிப்பாடு",
+ "sharedDevice": "கருவி ",
+ "sharedTest": "Test",
+ "sharedTestNotification": "சோதனை அறிவிப்பை அனுப்பவும்",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "நாட்காட்டி",
+ "sharedCalendars": "நாட்காட்டிகள் ",
+ "sharedFile": "கோப்பு",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "கோப்பைத் தேர்ந்தெடு",
+ "sharedPhone": "பேசி ",
+ "sharedRequired": "தேவையான",
+ "sharedPreferences": "விரும்பிய தேவைகள் ",
+ "sharedPermissions": "அனுமதிகள்",
+ "sharedConnections": "Connections",
+ "sharedExtra": "கூடுதல்",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "சரம்",
+ "sharedTypeNumber": "எண் ",
+ "sharedTypeBoolean": "பூலியன்",
+ "sharedTimezone": "நேர மண்டலம்",
+ "sharedInfoTitle": "தகவல் ",
+ "sharedSavedCommand": "சேமித்த கட்டளை",
+ "sharedSavedCommands": "சேமித்த கட்டளைகள்",
+ "sharedNew": "புதிய",
+ "sharedShowAddress": "முகவரி காட்டு",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "முடக்கப்பட்ட ",
+ "sharedMaintenance": "பராமரிப்பு",
+ "sharedDeviceAccumulators": "திரட்டி",
+ "sharedAlarms": "முக்கிய அறிவிப்பு ",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "வேக வரம்பு",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "பாலிலைன் தொலைவு",
+ "attributeReportIgnoreOdometer": "அறிக்கை: புறக்கணிக்க வாகன பயண தூர எண்ணி ",
+ "attributeWebReportColor": "வலை: அறிக்கை வண்ணம்",
+ "attributeDevicePassword": "சாதன கடவுச்சொல்",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "செயல்முறை: நகல் காரணிகள்",
+ "attributeColor": "நிறம்",
+ "attributeWebLiveRouteLength": "வலை : வாகன துரித பயண விபரம் ",
+ "attributeWebSelectZoom": "வலை: பெரிதாக்கு தேர்வு",
+ "attributeWebMaxZoom": "வலை: அதிகபட்ச பெரிதாக்கு",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "அஞ்சல்: SMTP புரவலன்",
+ "attributeMailSmtpPort": "அஞ்சல்: SMTP போர்ட்",
+ "attributeMailSmtpStarttlsEnable": "அஞ்சல்: SMTP STARTTLS இயக்கு",
+ "attributeMailSmtpStarttlsRequired": "அஞ்சல்: SMTP STARTTLS தேவை",
+ "attributeMailSmtpSslEnable": "அஞ்சல்: SMTP SSL இயக்கு",
+ "attributeMailSmtpSslTrust": "அஞ்சல்: SMTP SSL அறக்கட்டளை",
+ "attributeMailSmtpSslProtocols": "அஞ்சல்: SMTP SSL வழிமுறைகள் ",
+ "attributeMailSmtpFrom": "அஞ்சல்: SMTP துவக்கம் ",
+ "attributeMailSmtpAuth": "அஞ்சல்: SMTP Auth இயக்கு",
+ "attributeMailSmtpUsername": "அஞ்சல்: SMTP பயனர்பெயர்",
+ "attributeMailSmtpPassword": "அஞ்சல்: SMTP கடவுச்சொல்",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: முடக்கு நிகழ்வுகள்",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: முடக்கு இயக்கிகள்",
+ "attributeUiDisableComputedAttributes": "UI: கணக்கிடப்பட்ட பண்புக்கூறுகளை முடக்கு",
+ "attributeUiDisableCalendars": "UI: நாட்காட்டியை முடக்கு ",
+ "attributeUiDisableMaintenance": "UI: பராமரிப்பு முடக்கவும்",
+ "attributeUiHidePositionAttributes": "UI: நிலை காரணிகள் மறை",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "பிழை",
+ "errorGeneral": "தவறான அளவுருக்கள் அல்லது தடைகள் மீறல்",
+ "errorConnection": "இணைப்புப் பிழை",
+ "errorSocket": "வலை இணைப்பு பிழை",
+ "errorZero": "பூஜ்யமாக இருக்க முடியாது",
+ "userEmail": "மின்னஞ்சல்",
+ "userPassword": "கடவுச்சொல்",
+ "userAdmin": "நிர்வாகி",
+ "userRemember": "நினைவில் கொள்",
+ "userExpirationTime": "காலாவதி",
+ "userDeviceLimit": "சாதன வரம்பு",
+ "userUserLimit": "பயனர் வரம்பு",
+ "userDeviceReadonly": "சாதன வாசிப்பு",
+ "userLimitCommands": "வரம்பு கட்டளைகள்",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "டோக்கன் ",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "உள் நுழை",
+ "loginLanguage": "மொழி",
+ "loginReset": "Reset Password",
+ "loginRegister": "பதிவு செய்ய",
+ "loginLogin": "உள்நுழைய",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "தவறான மின்னஞ்சல் முகவரி அல்லது கடவுச்சொல்",
+ "loginCreated": "புதிய பயனர் பதிவு செய்யப்பட்டுள்ளது",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "வெளியேறு",
+ "loginLogo": "இலட்சினை ",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "கருவிகள் மற்றும் அதன் நிலை",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "சாதனம்",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "அடையாளங்காட்டி",
+ "deviceModel": "மாதிரி",
+ "deviceContact": "தொடர்பு",
+ "deviceCategory": "வகை",
+ "deviceLastUpdate": "கடைசியாக புதுப்பிக்கப்பட்டது",
+ "deviceCommand": "கட்டளை",
+ "deviceFollow": "பின்தொடர்",
+ "deviceTotalDistance": "மொத்த தூரம்",
+ "deviceStatus": "நிலைமை",
+ "deviceStatusOnline": "வலை தொடர்பில் ",
+ "deviceStatusOffline": "வலை தொடர்பில்லாமை ",
+ "deviceStatusUnknown": "தெரியாத",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "குழு",
+ "groupParent": "குழு",
+ "groupNoGroup": "குழு இல்லை",
+ "settingsTitle": "அமைப்பு",
+ "settingsUser": "கணக்கு",
+ "settingsGroups": "குழுக்கள்",
+ "settingsServer": "சர்வர்",
+ "settingsUsers": "உறுப்பினர்கள்",
+ "settingsDistanceUnit": "தூரம் அலகு",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "வேக அலகு",
+ "settingsVolumeUnit": "தொகுதி அலகு",
+ "settingsTwelveHourFormat": "12 மணி நேர வடிவம்",
+ "settingsCoordinateFormat": "வடிவமைப்பை ஒருங்கிணைக்கிறது",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "அறிக்கை",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "சாதனம்",
+ "reportGroup": "குழு",
+ "reportFrom": "இருந்து",
+ "reportTo": "வரை",
+ "reportShow": "காண்பி",
+ "reportClear": "அழி",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "செல்லுபடியான",
+ "positionAccuracy": "துல்லியம்",
+ "positionLatitude": "அட்சரேகை",
+ "positionLongitude": "தீர்க்கரேகை",
+ "positionAltitude": "உயரம்",
+ "positionSpeed": "வேகம்",
+ "positionCourse": "பாடநெறி",
+ "positionAddress": "முகவரி",
+ "positionProtocol": "புரோட்டோகால்",
+ "positionDistance": "தூரம்",
+ "positionRpm": "ஆர்பிஎம்",
+ "positionFuel": "எரிபொருள்",
+ "positionPower": "சக்தி",
+ "positionBattery": "மின்கலன் ",
+ "positionRaw": "மூல",
+ "positionIndex": "குறியீட்டு",
+ "positionHdop": "துல்லியமான கிடைமட்ட நீக்கம்",
+ "positionVdop": "துல்லியத்தின் செங்குத்து நீக்கம்",
+ "positionPdop": "துல்லியத்தின் நிலை நீக்கம்",
+ "positionSat": "செயற்கைக்கோள்கள்",
+ "positionSatVisible": "தெரியும் செயற்கைக்கோள்கள்",
+ "positionRssi": "சிக்னல் வலிமை காட்டி",
+ "positionGps": "உலகளாவிய நிலைப்படுத்தல் அமைப்பு",
+ "positionRoaming": "சுற்றி கொண்டு",
+ "positionEvent": "நிகழ்வு",
+ "positionAlarm": "அலாரம்",
+ "positionStatus": "நிலைமை ",
+ "positionOdometer": "பயண தூர விபரக்காட்டி ",
+ "positionServiceOdometer": "வாகன பயண தூர விபரக்காட்டி சேவைகள் ",
+ "positionTripOdometer": "வாகன பயண தூர விபரக்காட்டி ",
+ "positionHours": "மணி நேரம் ",
+ "positionSteps": "படிகள்",
+ "positionInput": "உள்ளீடு",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "வெளியீடு",
+ "positionBatteryLevel": "மின்கலன் நிலை",
+ "positionFuelConsumption": "எரிபொருள் பயன்பாடு",
+ "positionRfid": "ரேடியோ அதிர்வெண் அடையாளம்",
+ "positionVersionFw": "நிலையான மென்பொருள் பதிப்பு",
+ "positionVersionHw": "வன்பொருள் பதிப்பு",
+ "positionIgnition": "வாகன துவக்கி ",
+ "positionFlags": "கொடிகள்",
+ "positionCharge": "மின் ஆற்றல் சேமிக்க",
+ "positionIp": "இணைய நெறிமுறை",
+ "positionArchive": "காப்பகத்தை",
+ "positionVin": "வாகனம் அடையாள எண் ",
+ "positionApproximate": "தோராயமான",
+ "positionThrottle": "கழுத்துப்பகுதி",
+ "positionMotion": "இயக்கம்",
+ "positionArmed": "ஆயுத",
+ "positionAcceleration": "முடுக்கம்",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "சாதன வெப்பநிலை",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "இயக்குனர் ",
+ "positionCommand": "கட்டளை",
+ "positionBlocked": "தடுக்கப்பட்டது",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "ஓ பி டியின் வேகம் ",
+ "positionObdOdometer": "ஓ பி டி ஓடோமீட்டர் ",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "இயக்கி தனிப்பட்ட ஐடி",
+ "positionCard": "Card",
+ "positionImage": "படம் ",
+ "positionVideo": "Video",
+ "positionAudio": "ஒலி ",
+ "serverTitle": "சர்வர் அமைப்பு",
+ "serverZoom": "பெரிதாக்கு",
+ "serverRegistration": "பதிவுசெய்ய",
+ "serverReadonly": "படிக்கமட்டும்",
+ "serverForceSettings": "சக்தி அமைப்புகள்",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "வரைபடம்",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "வரைபடம் அடுக்கு",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "கார்ட்டோ வரைபடங்கள்",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "பிங் வரைபட கீ",
+ "mapBingRoad": "பிங் சாலை வரைபடம்",
+ "mapBingAerial": "பிங் வான்வழி வரைபடம்",
+ "mapBingHybrid": "பிங் வரைபடங்கள்",
+ "mapBaidu": "பைடு வரைபடங்கள்",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "யான் டெக்ஸ் வரைபடங்கள்",
+ "mapYandexSat": "யான் டெக்ஸ் செயற்கைக்கோள்",
+ "mapWikimedia": "விக்கிப்பீடியா",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "பலகோணம்",
+ "mapShapeCircle": "வட்டம்",
+ "mapShapePolyline": "பாலிலைன்",
+ "mapLiveRoutes": "நேரடி வழிகள்",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI லேயர்",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "நிலை",
+ "stateName": "சாட்டு",
+ "stateValue": "மதிப்பு",
+ "commandTitle": "கட்டளை",
+ "commandSend": "அனுப்பு",
+ "commandSent": "கட்டளை அனுப்பப்பட்டது",
+ "commandQueued": "கட்டளை வரிசைப்படுத்தப்பட்டது",
+ "commandUnit": "அலகு",
+ "commandCustom": "விருப்பமான கட்டளை",
+ "commandDeviceIdentification": "\nசாதன அடையாளம்",
+ "commandPositionSingle": "ஒற்றை அறிக்கை",
+ "commandPositionPeriodic": "காலமுறை அறிக்கையிடல்",
+ "commandPositionStop": "அறிக்கையிடுதல் நிறுத்து ",
+ "commandEngineStop": "எஞ்சின் நிறுத்து",
+ "commandEngineResume": "எஞ்சின் தொடங்க",
+ "commandAlarmArm": "அலறிமணி துவக்கம்",
+ "commandAlarmDisarm": "அலறிமணி நிறுத்தம்",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "நேர மண்டலம்",
+ "commandRequestPhoto": "புகைப்படம் வேண்டு",
+ "commandPowerOff": "சாதனத்தை முடக்கு ",
+ "commandRebootDevice": "சாதன மறுதுவக்கம்",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "குருஞ்செய்தி அனுப்பு",
+ "commandSendUssd": "ussd ஐ அனுப்பவும்",
+ "commandSosNumber": "அவசர அழைப்பு எண்(SOS)",
+ "commandSilenceTime": "அமைதி நேரம் அமைக்க",
+ "commandSetPhonebook": "தொலைபேசிப்புத்தகம் அமை",
+ "commandVoiceMessage": "குரல் செய்தி",
+ "commandOutputControl": "வெளியீட்டு கட்டுப்பாடு",
+ "commandVoiceMonitoring": "குரல் கண்காணிப்பு",
+ "commandSetAgps": "அடுக்களை அமைக்கவும்",
+ "commandSetIndicator": "காட்டி அமைக்க",
+ "commandConfiguration": "கட்டமைப்பு",
+ "commandGetVersion": "பதிப்பை பெரு",
+ "commandFirmwareUpdate": "பிர்மவாறு அமைத்தல் ",
+ "commandSetConnection": "இணைப்பு அமைக்க",
+ "commandSetOdometer": "ஓடோமீட்டர் அமைக்க ",
+ "commandGetModemStatus": "மோடம் நிலையைப் பெறுக",
+ "commandGetDeviceStatus": "சாதன விவரங்கள் பெறுக ",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "காலஇடைவெளி",
+ "commandTimezone": "நேர மண்டலத்தை முடக்கு",
+ "commandMessage": "குறுஞ்செய்தி",
+ "commandRadius": "ஆரம்",
+ "commandEnable": "செயல்படுத்த",
+ "commandData": "தரவு",
+ "commandIndex": "குறியீட்டு",
+ "commandPhone": "தொலைபேசி எண்",
+ "commandServer": "சர்வர்",
+ "commandPort": "தகவல் வழி ",
+ "eventAll": "அனைத்து நிகழ்வுகள்",
+ "eventDeviceOnline": "நிலை ஆன்லைன்",
+ "eventDeviceUnknown": "தெரியாத நிலை",
+ "eventDeviceOffline": "நிலை ஆஃப்லைன்",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "சாதனம் நகரும்",
+ "eventDeviceStopped": "சாதனம் நிறுத்தப்பட்டது",
+ "eventDeviceOverspeed": "வேகம் வரம்பை மீறிவிட்டது",
+ "eventDeviceFuelDrop": "எரிபொருள் குறைதல் ",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "கட்டளை விளைவு",
+ "eventGeofenceEnter": "புவி வேலிக்குள் நுழைந்தது",
+ "eventGeofenceExit": "புவி வேலி வெளியேறின",
+ "eventAlarm": "அலாரம்",
+ "eventIgnitionOn": "பற்றவைப்பு",
+ "eventIgnitionOff": "பற்றவைத்தல்",
+ "eventMaintenance": "பராமரிப்பு தேவை",
+ "eventTextMessage": "உரை செய்தி பெற்றது",
+ "eventDriverChanged": "இயக்குணர் மாற்றப்பட்டது",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "நீடிக்கும்",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "பொது",
+ "alarmSos": "அவசர உதவி ",
+ "alarmVibration": "அதிர்வு",
+ "alarmMovement": "இயக்கம்",
+ "alarmLowspeed": "குறைவான வேகம்",
+ "alarmOverspeed": "அதி வேகம் ",
+ "alarmFallDown": "கீழே விழுதல்",
+ "alarmLowPower": "குறைந்த சக்தி",
+ "alarmLowBattery": "குறைவான மின்கலம் ",
+ "alarmFault": "குற்றம்",
+ "alarmPowerOff": "சக்தி அணை",
+ "alarmPowerOn": "துவக்கு ",
+ "alarmDoor": "கதவு ",
+ "alarmLock": "பூட்டு ",
+ "alarmUnlock": "திறக்க",
+ "alarmGeofence": "புவி வேலி",
+ "alarmGeofenceEnter": "புவி வேலி நுழைவு ",
+ "alarmGeofenceExit": "குறைந்த சக்தி",
+ "alarmGpsAntennaCut": "gps ஆண்டெனா",
+ "alarmAccident": "விபத்து",
+ "alarmTow": "கயிறு",
+ "alarmIdle": "சும்மா",
+ "alarmHighRpm": "உயர் rpm",
+ "alarmHardAcceleration": "கடின முடுக்கம்",
+ "alarmHardBraking": "கடின முறிப்பு",
+ "alarmHardCornering": "கடின முனை",
+ "alarmLaneChange": "பாதை மாற்றம் ",
+ "alarmFatigueDriving": "சோர்வு ஓட்டுநர்",
+ "alarmPowerCut": "மின் வெட்டு",
+ "alarmPowerRestored": "சக்தி மீட்டெடுப்பு ",
+ "alarmJamming": "நெருக்குதல்",
+ "alarmTemperature": "வெப்ப நிலை",
+ "alarmParking": "பார்க்கிங்",
+ "alarmBonnet": "கார் குட்நெட்",
+ "alarmFootBrake": "கால் பிரேக்",
+ "alarmFuelLeak": "எரிபொருள் கசிவு",
+ "alarmTampering": "சேதப்படுத்திய",
+ "alarmRemoving": "நீக்கி",
+ "notificationType": "type of notification",
+ "notificationAlways": "எல்லா சாதனங்களும்",
+ "notificationNotificators": "சேனல்கள்",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "வலைத்தளம் ",
+ "notificatorMail": "மின்னஞ்சல்",
+ "notificatorSms": "குறுஞ்சய்தி ",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "பாதை",
+ "reportEvents": "நிகழ்வுகள்",
+ "reportTrips": "பயணங்கள்",
+ "reportStops": "நிறுத்தங்கள்",
+ "reportSummary": "சுருக்கம்",
+ "reportDaily": "Daily Summary",
+ "reportChart": "விளக்கப்படம்",
+ "reportConfigure": "கட்டமைக்கவும்",
+ "reportEventTypes": "நிகழ்வு வகைகள்",
+ "reportChartType": "விளக்கப்படம் வகை",
+ "reportShowMarkers": "குறிப்பான்கள் காட்டு",
+ "reportExport": "ஏற்றுமதி",
+ "reportEmail": "மின்னஞ்சல் அறிக்கை",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "காலம்",
+ "reportCustom": "விருப்ப",
+ "reportToday": "இன்று",
+ "reportYesterday": "நேற்று",
+ "reportThisWeek": "இந்த வாரம்",
+ "reportPreviousWeek": "முந்தைய வாரம்",
+ "reportThisMonth": "இந்த மாதம்",
+ "reportPreviousMonth": "சென்ற மாதம்",
+ "reportDeviceName": "சாதன பெயர்",
+ "reportAverageSpeed": "சராசரி வேகம்",
+ "reportMaximumSpeed": "அதிகபட்ச வேகம்",
+ "reportEngineHours": "இயந்திர மணி",
+ "reportDuration": "கால அளவு ",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "துவக்க நேரம் ",
+ "reportStartAddress": "தொடக்க முகவரி ",
+ "reportEndTime": "முடிவு நேரம்",
+ "reportEndAddress": "இறுதி முகவரி",
+ "reportSpentFuel": "எரிபொருள் செலவு",
+ "reportStartOdometer": "ஓடோமீட்டர் தொடக்கம்",
+ "reportEndOdometer": "ஓடோமீட்டர் முடிவு  ",
+ "statisticsTitle": "புள்ளியியல்",
+ "statisticsCaptureTime": "நேரம் பிடி",
+ "statisticsActiveUsers": "செயலில் பயனர்கள்",
+ "statisticsActiveDevices": "செயல்படும் சாதனங்கள் ",
+ "statisticsRequests": "கோரிக்கைகள் ",
+ "statisticsMessagesReceived": "செய்திகள் பெறப்பட்டன",
+ "statisticsMessagesStored": "சேமித்த செய்திகள்",
+ "statisticsGeocoder": "பூகோள கோரிக்கை",
+ "statisticsGeolocation": "பூகோள கோரிக்கைகள் ",
+ "categoryArrow": "அம்பு",
+ "categoryDefault": "இயல்புநிலை",
+ "categoryAnimal": "கால்நடை",
+ "categoryBicycle": "மிதிவண்டி",
+ "categoryBoat": "படகு",
+ "categoryBus": "பேருந்து",
+ "categoryCar": "கார்",
+ "categoryCamper": "Camper",
+ "categoryCrane": "கிரேன்",
+ "categoryHelicopter": "ஹெலிகாப்டர்",
+ "categoryMotorcycle": "மோட்டார் சைக்கிள்",
+ "categoryOffroad": "இனிய சாலை",
+ "categoryPerson": "நபர்",
+ "categoryPickup": "இடும்",
+ "categoryPlane": "விமானம்",
+ "categoryShip": "கப்பல்",
+ "categoryTractor": "டிராக்டர்",
+ "categoryTrain": "ரயில்",
+ "categoryTram": "டிராம்",
+ "categoryTrolleybus": "தள்ளுவண்டி",
+ "categoryTruck": "கண ரக வாகனம்",
+ "categoryVan": "வேன் வாகனம் ",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "துவக்கு ",
+ "maintenancePeriod": "காலம்"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/th.json b/legacy/web/l10n/th.json
new file mode 100644
index 00000000..95f783c4
--- /dev/null
+++ b/legacy/web/l10n/th.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "กำลังโหลด...",
+ "sharedHide": "ซ่อน",
+ "sharedSave": "จัดเก็บแฟ้มข้อมูล",
+ "sharedUpload": "อัพโหลด",
+ "sharedSet": "ตั้งค่า",
+ "sharedCancel": "ยกเลิก",
+ "sharedCopy": "คัดลอก",
+ "sharedAdd": "เพิ่ม",
+ "sharedEdit": "แก้ไข",
+ "sharedRemove": "ลบรายการ",
+ "sharedRemoveConfirm": "ยืนยันลบรายการ",
+ "sharedNoData": "ไม่มีข้อมูล",
+ "sharedSubject": "หัวข้อ",
+ "sharedYes": "ใช่",
+ "sharedNo": "ไม่",
+ "sharedKm": "กม.",
+ "sharedMi": "ไมล์",
+ "sharedNmi": "nml",
+ "sharedMeters": "ม.",
+ "sharedFeet": "ฟุต",
+ "sharedKn": "น๊อต",
+ "sharedKmh": "กม./ชม.",
+ "sharedMph": "ไมล์ต่อชั่วโมง",
+ "sharedHour": "ชั่วโมง",
+ "sharedMinute": "นาที",
+ "sharedSecond": "วินาที",
+ "sharedDays": "วัน",
+ "sharedHours": "ชั่วโมง",
+ "sharedMinutes": "นาที",
+ "sharedDecimalDegrees": "องศา ทศนิยม",
+ "sharedDegreesDecimalMinutes": "องศา นาที",
+ "sharedDegreesMinutesSeconds": "องศา นาที วินาที",
+ "sharedName": "ชื่อ",
+ "sharedDescription": "คำอธิบาย",
+ "sharedSearch": "ค้นหา",
+ "sharedIconScale": "ขนาดไอคอน",
+ "sharedGeofence": "เขตพื้นที่",
+ "sharedGeofences": "เขตพื้นที่",
+ "sharedCreateGeofence": "สร้างขอบเขตภูมิศาสตร์",
+ "sharedNotifications": "การแจ้งเตือน",
+ "sharedNotification": "แจ้งเตือน",
+ "sharedAttributes": "คุณลักษณะ",
+ "sharedAttribute": "คุณลักษณะ",
+ "sharedDrivers": "ไดร์เวอร์",
+ "sharedDriver": "คนขับรถ",
+ "sharedArea": "พื้นที่",
+ "sharedSound": "การแจ้งเตือนเสียง",
+ "sharedType": "ชนิด",
+ "sharedDistance": "ระยะทาง",
+ "sharedHourAbbreviation": "ชม.",
+ "sharedMinuteAbbreviation": "นาที",
+ "sharedSecondAbbreviation": "วินาที",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "ลิตร",
+ "sharedGallonAbbreviation": "แกลลอน",
+ "sharedLiter": "ลิตร",
+ "sharedImpGallon": "Imp แกลลอน",
+ "sharedUsGallon": "U.S. แกลลอน",
+ "sharedLiterPerHourAbbreviation": "ลิตรต่อชั่วโมง",
+ "sharedGetMapState": "ได้รับสถานะแผนที่",
+ "sharedComputedAttribute": "คำนวณแอตทริบิวต์",
+ "sharedComputedAttributes": "คำนวณแอตทริบิวต์",
+ "sharedCheckComputedAttribute": "ตรวจสอบคอมพิวเตอร์แอตทริบิวต์",
+ "sharedExpression": "การแสดงออก",
+ "sharedDevice": "อุปกรณ์",
+ "sharedTest": "ทดสอบ",
+ "sharedTestNotification": "ส่งการแจ้งเตือนการทดสอบ",
+ "sharedTestNotificators": "ทดสอบแชนแนล",
+ "sharedTestExpression": "ทดสอบนิพจน์",
+ "sharedCalendar": "ปฏิทิน",
+ "sharedCalendars": "ปฏิทิน",
+ "sharedFile": "ไฟล์",
+ "sharedSearchDevices": "ค้นหาอุปกรณ์",
+ "sharedSortBy": "เรียงตาม",
+ "sharedFilterMap": "กรองบนแผนที่",
+ "sharedSelectFile": "เลือกไฟล์",
+ "sharedPhone": "โทรศัพท์",
+ "sharedRequired": "ต้องระบุ",
+ "sharedPreferences": "การตั้งค่า",
+ "sharedPermissions": "สิทธิ์",
+ "sharedConnections": "การเชื่อมต่อ",
+ "sharedExtra": "พิเศษ",
+ "sharedPrimary": "หลัก",
+ "sharedSecondary": "รอง",
+ "sharedTypeString": "ตัวอักษร",
+ "sharedTypeNumber": "จำนวน",
+ "sharedTypeBoolean": "ตัวเลข",
+ "sharedTimezone": "เขตเวลา",
+ "sharedInfoTitle": "ข้อมูล",
+ "sharedSavedCommand": "บันทึกคำสั่ง",
+ "sharedSavedCommands": "บันทึกคำสั่ง",
+ "sharedNew": "ใหม่...",
+ "sharedShowAddress": "แสดงที่อยู่",
+ "sharedShowDetails": "รายละเอียดเพิ่มเติม",
+ "sharedDisabled": "ปิดการใช้งาน",
+ "sharedMaintenance": "ซ่อมบำรุง",
+ "sharedDeviceAccumulators": "รวม",
+ "sharedAlarms": "เตือน",
+ "sharedLocation": "สถานที่",
+ "sharedImport": "นำเข้า",
+ "sharedColumns": "คอลัมน์",
+ "sharedDropzoneText": "ลากและวางไฟล์ที่นี่หรือคลิก",
+ "sharedLogs": "Logs",
+ "sharedLink": "ลิงก์",
+ "calendarSimple": "เรียบง่าย",
+ "calendarRecurrence": "การเกิดซ้ำ",
+ "calendarOnce": "ครั้งเดียว",
+ "calendarDaily": "รายวัน",
+ "calendarWeekly": "รายสัปดาห์",
+ "calendarMonthly": "รายเดือน",
+ "calendarDays": "วัน",
+ "calendarSunday": "อาทิตย์",
+ "calendarMonday": "วันจันทร์",
+ "calendarTuesday": "วันอังคาร",
+ "calendarWednesday": "วันพุธ",
+ "calendarThursday": "วันพฤหัสบดี",
+ "calendarFriday": "วันศุกร์",
+ "calendarSaturday": "วันเสาร์",
+ "attributeShowGeofences": "แสดงขอบเขตภูมิศาสตร์",
+ "attributeSpeedLimit": "จำกัดความเร็ว",
+ "attributeFuelDropThreshold": "เกณฑ์การลดของเชื้อเพลิง",
+ "attributeFuelIncreaseThreshold": "เกณฑ์การเพิ่มของเชื้อเพลิง",
+ "attributePolylineDistance": "เส้นระยะทาง",
+ "attributeReportIgnoreOdometer": "รายงาน: ละเว้นวัดระยะ",
+ "attributeWebReportColor": "เว็บ: สีรายงาน",
+ "attributeDevicePassword": "รหัสผ่านอุปกรณ์",
+ "attributeDeviceImage": "ภาพอุปกรณ์",
+ "attributeDeviceInactivityStart": "อุปกรณ์ยังไม่เริ่มทำงาน",
+ "attributeDeviceInactivityPeriod": "ระยะเวลาที่อุปกรณ์ไม่ทำงาน",
+ "attributeProcessingCopyAttributes": "การประมวลผล: คัดลอกคุณสมบัติ",
+ "attributeColor": "สี",
+ "attributeWebLiveRouteLength": "เว็บ: สดเส้นทางความยาว",
+ "attributeWebSelectZoom": "เว็บ: ขยายเมื่อเลือก",
+ "attributeWebMaxZoom": "เว็บ: ซูมสูงสุด",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "รหัสผู้ใช้ Pushover",
+ "attributePushoverDeviceNames": "ชื่ออุปกรณ์ Pushover",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Host",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: ปิดใช้งานคำสั่งที่บันทึกไว้",
+ "attributeUiDisableAttributes": "UI: ปิดใช้งานแอตทริบิวต์",
+ "attributeUiDisableGroups": "UI: ปิดการใช้งานกลุ่ม",
+ "attributeUiDisableEvents": "UI: ปิดการใช้งานเหตุการณ์",
+ "attributeUiDisableVehicleFeatures": "UI : ปิดการใช้งานคุณสมบัติของยานพาหนะ",
+ "attributeUiDisableDrivers": "UI: ปิดการใช้งานไดร์เวอร์",
+ "attributeUiDisableComputedAttributes": "UI: ปิดใช้งานแอ็ตทริบิวต์ที่คำนวณ",
+ "attributeUiDisableCalendars": "UI: ปิดปฏิทิน",
+ "attributeUiDisableMaintenance": "UI: ปิด-ซ่อมบำรุง",
+ "attributeUiHidePositionAttributes": "UI: ซ่อนตำแหน่งลักษณะ",
+ "attributeUiDisableLoginLanguage": "UI: ปิดการใช้งานภาษาเข้าสู่ระบบ",
+ "attributeNotificationTokens": "โทเค็นการแจ้งเตือน",
+ "attributePopupInfo": "ป๊อปอัปข้อมูล",
+ "errorTitle": "ผิดพลาด",
+ "errorGeneral": "ไม่ถูกต้องพารามิเตอร์หรือ จำกัด การละเมิด",
+ "errorConnection": "การเชื่อมต่อผิดพลาด",
+ "errorSocket": "ข้อผิดพลาดการเชื่อมต่อซ็อกเก็ตเว็บ",
+ "errorZero": "ไม่สามารถเป็นศูนย์",
+ "userEmail": "อีเมล์",
+ "userPassword": "รหัสผ่าน",
+ "userAdmin": "ผู้ดูแลระบบ",
+ "userRemember": "จำไว้",
+ "userExpirationTime": "วันหมดอายุ",
+ "userDeviceLimit": "จำนวน อุปกรณ์",
+ "userUserLimit": "ขีดจำกัดผู้ใช้",
+ "userDeviceReadonly": "อุปกรณ์ อ่านได้อย่างเดียว",
+ "userLimitCommands": "จำกัดคำสั่ง",
+ "userDisableReports": "ปิดการใช้งานรายงาน",
+ "userFixedEmail": "ไม่มีการเปลี่ยนแปลงอีเมล",
+ "userToken": "Token",
+ "userDeleteAccount": "ลบบัญชี",
+ "userTemporary": "ชั่วคราว",
+ "loginTitle": "เข้าสู่ระบบ",
+ "loginLanguage": "ภาษา",
+ "loginReset": "รีเซ็ตรหัสผ่าน",
+ "loginRegister": "ลงทะเบียน",
+ "loginLogin": "เข้าสู่ระบบ",
+ "loginOpenId": "เข้าสู่ระบบด้วย OpenID",
+ "loginFailed": "ที่อยู่อีเมลหรือรหัสผ่านไม่ถูกต้อง",
+ "loginCreated": "ผู้ใช้ใหม่ ได้รับการลงทะเบียน",
+ "loginResetSuccess": "ตรวจสอบอีเมลของคุณ",
+ "loginUpdateSuccess": "ตั้งรหัสผ่านใหม่แล้ว",
+ "loginLogout": "ออกจากระบบ",
+ "loginLogo": "Logo",
+ "loginTotpCode": "รหัสผ่านแบบใช้ครั้งเดียว",
+ "loginTotpKey": "คีย์ รหัสผ่านครั้งเดียว",
+ "devicesAndState": "อุปกรณ์และสถานะ",
+ "deviceSelected": "อุปกรณ์ที่เลือก",
+ "deviceTitle": "เครื่อง/อุปกรณ์",
+ "devicePrimaryInfo": "ชื่ออุปกรณ์",
+ "deviceSecondaryInfo": "รายละเอียดอุปกรณ์",
+ "deviceIdentifier": "ระบุเลขอุปกรณ์",
+ "deviceModel": "รุ่น",
+ "deviceContact": "เบอร์ติดต่อ",
+ "deviceCategory": "หมวดหมู่",
+ "deviceLastUpdate": "แก้ไขล่าสุด",
+ "deviceCommand": "คำสั่ง",
+ "deviceFollow": "ติดตาม",
+ "deviceTotalDistance": "รวม ระยะทาง",
+ "deviceStatus": "สถานะ",
+ "deviceStatusOnline": "ออนไลน์",
+ "deviceStatusOffline": "ออฟไลน์",
+ "deviceStatusUnknown": "ไม่รู้จัก",
+ "deviceRegisterFirst": "ลงทะเบียนอุปกรณ์เครื่องแรกของคุณ",
+ "deviceIdentifierHelp": "IMEI หมายเลขซีเรียลหรือรหัสอื่นๆ จะต้องตรงกับรายงานอุปกรณ์ระบุไปยังเซิร์ฟเวอร์",
+ "deviceShare": "แบ่งปันอุปกรณ์",
+ "groupDialog": "กลุ่ม",
+ "groupParent": "กลุ่ม",
+ "groupNoGroup": "ไม่จัดกลุ่ม",
+ "settingsTitle": "การตั้งค่า",
+ "settingsUser": "บัญชีผู้ใช้",
+ "settingsGroups": "ตั้งค่ากลุ่ม",
+ "settingsServer": "เซิร์ฟเวอร์",
+ "settingsUsers": "ตั้งค่าผู้ใช้งาน",
+ "settingsDistanceUnit": "หน่วยระยะทาง",
+ "settingsAltitudeUnit": "หน่วยระดับความสูง",
+ "settingsSpeedUnit": "หน่วยความเร็ว",
+ "settingsVolumeUnit": "หน่วยจำนวน",
+ "settingsTwelveHourFormat": "รูปแบบเวลา 12 ชั่วโมง",
+ "settingsCoordinateFormat": "รูปแบบพิกัด",
+ "settingsServerVersion": "เวอร์ชั่นเซิร์ฟเวอร์",
+ "settingsAppVersion": "เวอร์ชั่นแอพ",
+ "settingsConnection": "การเชื่อมต่อ",
+ "settingsDarkMode": "โหมดมืด",
+ "settingsTotpEnable": "เปิดใช้งานรหัสผ่านครั้งเดียว",
+ "settingsTotpForce": "บังคับใช้รหัสผ่านครั้งเดียว",
+ "settingsServiceWorkerUpdateInterval": "รอบเวลาการอัปเดต ServiceWorker",
+ "settingsUpdateAvailable": "มีการอัพเดต",
+ "settingsSupport": "การสนับสนุน",
+ "reportTitle": "รายงาน",
+ "reportScheduled": "รายงานตามกำหนดเวลา",
+ "reportDevice": "รายงานเครื่อง/อุปกรณ์",
+ "reportGroup": "กลุ่ม",
+ "reportFrom": "จาก",
+ "reportTo": "ไปถึง",
+ "reportShow": "แสดง",
+ "reportClear": "ล้างรายงาน",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "แก้ไขเวลา",
+ "positionDeviceTime": "เวลาอุปกรณ์",
+ "positionServerTime": "เวลาเซิร์ฟเวอร์",
+ "positionValid": "ถูกต้อง",
+ "positionAccuracy": "ความถูกต้อง",
+ "positionLatitude": "ละติจูด",
+ "positionLongitude": "ลองจิจูด",
+ "positionAltitude": "แอตติจูด",
+ "positionSpeed": "ความเร็ว",
+ "positionCourse": "ทิศทาง",
+ "positionAddress": "ที่อยู่",
+ "positionProtocol": "โปรโตคอล",
+ "positionDistance": "ระยะทาง",
+ "positionRpm": "RPM",
+ "positionFuel": "เชื้อเพลิง",
+ "positionPower": "พลังงาน",
+ "positionBattery": "แบตเตอรี่",
+ "positionRaw": "ดิบ",
+ "positionIndex": "ดัชนี",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "ดาวเทียม",
+ "positionSatVisible": "ดาวเทียมที่มองเห็นได้",
+ "positionRssi": "RSSI",
+ "positionGps": "จีพีเอส",
+ "positionRoaming": "โรมมิ่ง",
+ "positionEvent": "กิจกรรม",
+ "positionAlarm": "แจ้งเตือน",
+ "positionStatus": "สถานะ",
+ "positionOdometer": "วัดระยะทาง",
+ "positionServiceOdometer": "บริการวัดระยะทาง",
+ "positionTripOdometer": "มาตรวัดการเดินทาง",
+ "positionHours": "ชั่วโมง",
+ "positionSteps": "Steps",
+ "positionInput": "อินพุต",
+ "positionHeartRate": "อัตราการเต้นของหัวใจ",
+ "positionOutput": "เอาต์พุต",
+ "positionBatteryLevel": "ระดับแบตเตอรี่",
+ "positionFuelConsumption": "การใช้น้ำมันเชื้อเพลิง",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "ระบบจุดระเบิด",
+ "positionFlags": "สัญลักษณ์",
+ "positionCharge": "ชาร์จ",
+ "positionIp": "IP",
+ "positionArchive": "เก็บ",
+ "positionVin": "VIN",
+ "positionApproximate": "ประมาณ",
+ "positionThrottle": "คันเร่ง",
+ "positionMotion": "เคลื่อนไหว",
+ "positionArmed": "Armed",
+ "positionAcceleration": "การเร่งความเร็ว",
+ "positionTemp": "อุณหภูมิ",
+ "positionDeviceTemp": "อุณหภูมิของอุปกรณ์",
+ "positionCoolantTemp": "อุณหภูมิน้ำหล่อเย็น",
+ "positionOperator": "ผู้ประกอบการ",
+ "positionCommand": "คำสั่ง",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "ความเร็ว OBD",
+ "positionObdOdometer": "มาตรวัดระยะ OBD",
+ "positionDrivingTime": "เวลาในการขับขี่",
+ "positionDriverUniqueId": "หมายเลขเฉพาะไดร์เวอร์",
+ "positionCard": "การ์ด",
+ "positionImage": "รูปภาพ",
+ "positionVideo": "วิดีโอ",
+ "positionAudio": "เสียง",
+ "serverTitle": "การตั้งค่าเซิร์ฟเวอร์",
+ "serverZoom": "ชยาย +/-",
+ "serverRegistration": "ลงทะเบียน",
+ "serverReadonly": "อ่านได้อย่างเดียว",
+ "serverForceSettings": "บังคับ การตั้งค่า",
+ "serverAnnouncement": "ประกาศ",
+ "serverName": "ชื่อเซิร์ฟเวอร์",
+ "serverDescription": "รายละเอียดเซิร์ฟเวอร์",
+ "serverColorPrimary": "สีหลัก",
+ "serverColorSecondary": "สีรอง",
+ "serverLogo": "รูปภาพโลโก้",
+ "serverLogoInverted": "กลับด้านภาพโลโก้แล้ว",
+ "serverChangeDisable": "ปิดใช้งานการเปลี่ยนแปลงเซิร์ฟเวอร์",
+ "serverDisableShare": "ปิดใช้งานการแชร์อุปกรณ์",
+ "mapTitle": "แผนที่",
+ "mapActive": "แผนที่ที่ใช้งานอยู่",
+ "mapOverlay": "การวางซ้อนแผนที่",
+ "mapOverlayCustom": "การวางซ้อนแบบกำหนดเอง",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "ปริมาณน้ำฝน OpenWeather",
+ "mapOpenWeatherPressure": "ความดัน OpenWeather",
+ "mapOpenWeatherWind": "ลม OpenWeather",
+ "mapOpenWeatherTemperature": "อุณหภูมิ OpenWeather",
+ "mapLayer": "ชั้นแผนที่",
+ "mapCustom": "กำหนดเอง (XYZ)",
+ "mapCustomArcgis": "กำหนดเอง (ArcGIS)",
+ "mapCustomLabel": "แผนที่ที่กำหนดเอง",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps สำคัญ",
+ "mapBingRoad": "Bing Maps ถนน",
+ "mapBingAerial": "Bing Maps ทางอากาศ",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "การสำรวจยุทโธปกรณ์",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "รูปหลายมุม",
+ "mapShapeCircle": "วงกลม",
+ "mapShapePolyline": "โพลีไลน์",
+ "mapLiveRoutes": "เส้นทาง Live",
+ "mapDirection": "แสดงทิศทาง",
+ "mapCurrentLocation": "สถานที่ปัจจุบัน",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "การจัดกลุ่มเครื่องหมาย",
+ "mapOnSelect": "แสดงแผนที่บริเวณที่เลือก",
+ "mapDefault": "แผนที่เริ่มต้น",
+ "stateTitle": "สถานะ",
+ "stateName": "พารามิเตอร์",
+ "stateValue": "มูลค่า",
+ "commandTitle": "คำสั่ง",
+ "commandSend": "ส่ง",
+ "commandSent": "คำสั่ง-ส่งแล้ว",
+ "commandQueued": "คำสั่ง-คิว",
+ "commandUnit": "หน่วย",
+ "commandCustom": "คำสั่งกำหนดเอง",
+ "commandDeviceIdentification": "หมายเลขอุปกรณ์",
+ "commandPositionSingle": "รายงานตำแหน่งเดียว",
+ "commandPositionPeriodic": "แก้ไขตำแหน่ง",
+ "commandPositionStop": "ตำแหน่ง หยุด",
+ "commandEngineStop": "ดับเครื่องยนต์",
+ "commandEngineResume": "ติดครื่องยนต์ใหม่",
+ "commandAlarmArm": "แจ้งเตือนติดต่อสาขา",
+ "commandAlarmDisarm": "แจ้งเตือนยกเลิกติดต่อสาขา",
+ "commandAlarmDismiss": "ปิดการเตือน",
+ "commandSetTimezone": "ตั้งค่าเขตเวลา",
+ "commandRequestPhoto": "สั่งถ่ายภาพ",
+ "commandPowerOff": "ปิดอุปกรณ์",
+ "commandRebootDevice": "รีบูต",
+ "commandFactoryReset": "รีเซ็ตเป็นค่าจากโรงงาน",
+ "commandSendSms": "ส่ง SMS",
+ "commandSendUssd": "ส่ง USSD",
+ "commandSosNumber": "ตั้งค่าเลขหมายโทรฉุกเฉิน SOS",
+ "commandSilenceTime": "ตั้งค่าช่วงเวลาหยุดนิ่ง",
+ "commandSetPhonebook": "ตั้งค่าสมุดโทรศัพท์",
+ "commandVoiceMessage": "ข้อความเสียง",
+ "commandOutputControl": "ควบคุมข้อมูลที่ส่งออก",
+ "commandVoiceMonitoring": "การตรวจสอบด้วยเสียง",
+ "commandSetAgps": "ตั้งค่า AGPS",
+ "commandSetIndicator": "ตั้งค่าตัวบ่งชี้",
+ "commandConfiguration": "องค์ประกอบ",
+ "commandGetVersion": "รับเวอร์ชัน",
+ "commandFirmwareUpdate": "อัพเดตเฟิร์มแวร์",
+ "commandSetConnection": "ตั้งค่าการเชื่อมต่อ",
+ "commandSetOdometer": "ตั้งค่ามาตรวัดระยะทาง",
+ "commandGetModemStatus": "ดูสถานะโมเด็ม",
+ "commandGetDeviceStatus": "รับสถานะอุปกรณ์",
+ "commandSetSpeedLimit": "ตั้งขีดจำกัดความเร็ว",
+ "commandModePowerSaving": "โหมดประหยัดพลังงาน",
+ "commandModeDeepSleep": "โหมดหลับลึก",
+ "commandAlarmGeofence": "ตั้งเตือน Geofence",
+ "commandAlarmBattery": "ตั้งการเตือนแบตเตอรี่",
+ "commandAlarmSos": "ตั้งการเตือน SOS",
+ "commandAlarmRemove": "ตั้งลบการเตือน",
+ "commandAlarmClock": "ตั้งนาฬิการปลุก",
+ "commandAlarmSpeed": "ตั้งการเตือนความเร็ว",
+ "commandAlarmFall": "ตั้งการเตือนการตก",
+ "commandAlarmVibration": "ตั้งการเตือนการสั่น",
+ "commandFrequency": "ความถี่",
+ "commandTimezone": "เขตเวลา ตรงข้าม",
+ "commandMessage": "ข้อความ",
+ "commandRadius": "รัศมี",
+ "commandEnable": "เปิดใช้งาน",
+ "commandData": "ข้อมูล",
+ "commandIndex": "ดัชนี",
+ "commandPhone": "หมายเลขโทรศัพท์",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "เหตุการณ์ทั้งหมด",
+ "eventDeviceOnline": "ออนไลน์",
+ "eventDeviceUnknown": "ไม่ระบุ",
+ "eventDeviceOffline": "ออฟไลน์",
+ "eventDeviceInactive": "อุปกรณ์ไม่ทำงาน",
+ "eventQueuedCommandSent": "ส่งคำสั่งเข้าคิวแล้ว",
+ "eventDeviceMoving": "เคลื่อนที่",
+ "eventDeviceStopped": "หยุด/จอด",
+ "eventDeviceOverspeed": "ความเร็วเกิน",
+ "eventDeviceFuelDrop": "เชื้อเพลิงลด",
+ "eventDeviceFuelIncrease": "น้ำมันเชื้อเพลิงเพิ่มขึ้น",
+ "eventCommandResult": "ผลลัพธ์จากคำสั่ง",
+ "eventGeofenceEnter": "เข้าเขต",
+ "eventGeofenceExit": "ออกนอกเขต",
+ "eventAlarm": "เตือน",
+ "eventIgnitionOn": "เครื่องยนต์ติด",
+ "eventIgnitionOff": "เครื่องยนต์ดับ",
+ "eventMaintenance": "จำเป็นต้อง บำรุงรักษา",
+ "eventTextMessage": "ข้อความที่ได้รับ",
+ "eventDriverChanged": "เปลี่ยนคนขับ",
+ "eventMedia": "สื่อ",
+ "eventsScrollToLast": "เลื่อนไปที่ล่าสุด",
+ "eventsSoundEvents": "เสียงเหตุการณ์",
+ "eventsSoundAlarms": "เสียงปลุก",
+ "alarmGeneral": "ทั่วไป",
+ "alarmSos": "SOS",
+ "alarmVibration": "สั่นสะเทือน",
+ "alarmMovement": "เคลื่อนที่",
+ "alarmLowspeed": "เคลื่อนช้าๆ",
+ "alarmOverspeed": "ความเร็วเกิน",
+ "alarmFallDown": "ร่วงหล่น",
+ "alarmLowPower": "กำลัง-อ่อน",
+ "alarmLowBattery": "แบต-อ่อน",
+ "alarmFault": "ผิดพลาด",
+ "alarmPowerOff": "ปิดเครื่อง",
+ "alarmPowerOn": "เปิดเครื่อง",
+ "alarmDoor": "ประตู",
+ "alarmLock": "ล็อค",
+ "alarmUnlock": "ปลดล็อค",
+ "alarmGeofence": "ขอบเขต",
+ "alarmGeofenceEnter": "เข้าขอบเขต",
+ "alarmGeofenceExit": "ออกขอบเขต",
+ "alarmGpsAntennaCut": "เสา GPS ตัด",
+ "alarmAccident": "อุบัติเหตุ",
+ "alarmTow": "ลาก",
+ "alarmIdle": "นิ่ง",
+ "alarmHighRpm": "รอบเครื่องสูง",
+ "alarmHardAcceleration": "ออกตัวแรง",
+ "alarmHardBraking": "เบรคแรง",
+ "alarmHardCornering": "เลี้ยวกระทันหัน",
+ "alarmLaneChange": "เปลี่ยนเลน",
+ "alarmFatigueDriving": "ขับรถ-ล้า",
+ "alarmPowerCut": "ตัดสตาร์ท",
+ "alarmPowerRestored": "ไฟฟ้า-ต่อ",
+ "alarmJamming": "สัญญาณรบกวน",
+ "alarmTemperature": "อุณหภูมิ",
+ "alarmParking": "จอด",
+ "alarmBonnet": "ฝาสูบ",
+ "alarmFootBrake": "เบรคเท้า",
+ "alarmFuelLeak": "เชื้อเพลิงรั่ว",
+ "alarmTampering": "บุกรุกเครื่อง",
+ "alarmRemoving": "ถอดออก",
+ "notificationType": "ชนิดการแจ้งเตือน",
+ "notificationAlways": "อุปกรณ์ทั้งหมด",
+ "notificationNotificators": "ช่อง",
+ "notificatorCommand": "คำสั่ง",
+ "notificatorWeb": "เว็ป",
+ "notificatorMail": "เมลล์",
+ "notificatorSms": "ส่งข้อความ",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "เล่นซ้ำ",
+ "reportCombined": "รวมเรียบร้อยแล้ว",
+ "reportRoute": "เส้นทาง",
+ "reportEvents": "เหตุการณ์",
+ "reportTrips": "การเดินทาง",
+ "reportStops": "จุดจอด",
+ "reportSummary": "ผลรวม",
+ "reportDaily": "สรุปรายวัน",
+ "reportChart": "แผนภูมิ",
+ "reportConfigure": "ตั้งค่า",
+ "reportEventTypes": "ประเภทเหตุการณ์",
+ "reportChartType": "ชนิดของแผนภูมิ",
+ "reportShowMarkers": "แสดงเครื่องหมาย",
+ "reportExport": "ส่งออก",
+ "reportEmail": "รายงาน-Email",
+ "reportSchedule": "กำหนดการ",
+ "reportPeriod": "ช่วงเวลา",
+ "reportCustom": "กำหนดเอง",
+ "reportToday": "วันนี้",
+ "reportYesterday": "เมื่อวาน",
+ "reportThisWeek": "สัปดาห์นี้",
+ "reportPreviousWeek": "สัปดาห์ก่อน",
+ "reportThisMonth": "เดือนนี้",
+ "reportPreviousMonth": "เดือนก่อน",
+ "reportDeviceName": "ชื่ออุปกรณ์",
+ "reportAverageSpeed": "ความเร็วเฉลี่ย",
+ "reportMaximumSpeed": "ความเร็วสูงสุด",
+ "reportEngineHours": "เวลาการทำงานเครื่องยนต์",
+ "reportDuration": "ช่วงเวลา",
+ "reportStartDate": "วันที่เริ่ม",
+ "reportStartTime": "เวลาเริ่มต้น",
+ "reportStartAddress": "จุดเริ่มต้น",
+ "reportEndTime": "เวลาสิ้นสุด",
+ "reportEndAddress": "จุดสิ้นสุด",
+ "reportSpentFuel": "เชื้อเพลิงที่ใช้",
+ "reportStartOdometer": "เดินทาง-เริ่ม",
+ "reportEndOdometer": "เดินทาง-สิ้นสุด",
+ "statisticsTitle": "ข้อมูลสถิติ",
+ "statisticsCaptureTime": "จับเวลา",
+ "statisticsActiveUsers": "ผู้ใช้ที่ใช้งานอยู่",
+ "statisticsActiveDevices": "อุปกรณ์ที่ใช้งานอยู่",
+ "statisticsRequests": "การร้องขอ",
+ "statisticsMessagesReceived": "ข้อความที่ได้รับ",
+ "statisticsMessagesStored": "ข้อความที่เก็บไว้",
+ "statisticsGeocoder": "คำขอรหัสทางภูมิศาสตร์",
+ "statisticsGeolocation": "คำขอตำแหน่งทางภูมิศาสตร์",
+ "categoryArrow": "ลูกศร",
+ "categoryDefault": "ค่าเริ่มต้น",
+ "categoryAnimal": "สัตว์",
+ "categoryBicycle": "จักรยาน",
+ "categoryBoat": "เรือ",
+ "categoryBus": "รถบัส",
+ "categoryCar": "รถยนต์",
+ "categoryCamper": "คนพักแรม",
+ "categoryCrane": "เครน",
+ "categoryHelicopter": "เฮลิคอปเตอร์",
+ "categoryMotorcycle": "รถจักรยานยนต์",
+ "categoryOffroad": "ออฟโร้ด",
+ "categoryPerson": "บุคคล",
+ "categoryPickup": "รถกระบะ",
+ "categoryPlane": "เครื่องบิน",
+ "categoryShip": "เรือ",
+ "categoryTractor": "รถแทรกเตอร์",
+ "categoryTrain": "รถไฟ",
+ "categoryTram": "รถราง",
+ "categoryTrolleybus": "รถยก",
+ "categoryTruck": "รถบรรทุก",
+ "categoryVan": "รถตู้",
+ "categoryScooter": "สกู๊ตเตอร์",
+ "maintenanceStart": "เริ่มต้น",
+ "maintenancePeriod": "ระยะเวลา"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/tr.json b/legacy/web/l10n/tr.json
new file mode 100644
index 00000000..ff534af7
--- /dev/null
+++ b/legacy/web/l10n/tr.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Yükleniyor...",
+ "sharedHide": "Gizle",
+ "sharedSave": "Kaydet",
+ "sharedUpload": "Upload",
+ "sharedSet": "Belirle",
+ "sharedCancel": "İptal",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Ekle",
+ "sharedEdit": "Düzenle",
+ "sharedRemove": "Kaldır",
+ "sharedRemoveConfirm": "Öğeyi kaldır",
+ "sharedNoData": "Veri yok",
+ "sharedSubject": "Subject",
+ "sharedYes": "Evet",
+ "sharedNo": "Hayır",
+ "sharedKm": "km",
+ "sharedMi": "mil",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "knot",
+ "sharedKmh": "km/s",
+ "sharedMph": "mil/s",
+ "sharedHour": "Saat",
+ "sharedMinute": "Dakika",
+ "sharedSecond": "Saniye",
+ "sharedDays": "gün",
+ "sharedHours": "saat",
+ "sharedMinutes": "dakika",
+ "sharedDecimalDegrees": "Onluk Derece",
+ "sharedDegreesDecimalMinutes": "Onluk Dakika Derecesi",
+ "sharedDegreesMinutesSeconds": "Dakika Saniye Derecesi",
+ "sharedName": "İsim",
+ "sharedDescription": "Açıklama",
+ "sharedSearch": "Arama",
+ "sharedIconScale": "Simge Ölçeği",
+ "sharedGeofence": "Güvenli Bölge",
+ "sharedGeofences": "Güvenli Bölgeler",
+ "sharedCreateGeofence": "Coğrafi Sınır oluştur",
+ "sharedNotifications": "Bildirimler",
+ "sharedNotification": "Bildirim",
+ "sharedAttributes": "Nitelikler",
+ "sharedAttribute": "Nitelik",
+ "sharedDrivers": "Sürücüler",
+ "sharedDriver": "Sürücü",
+ "sharedArea": "Bölge",
+ "sharedSound": "Bildirim sesi",
+ "sharedType": "Tip",
+ "sharedDistance": "Mesafe",
+ "sharedHourAbbreviation": "s",
+ "sharedMinuteAbbreviation": "d",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "galon",
+ "sharedLiter": "Litre",
+ "sharedImpGallon": "İngiliz Galonu",
+ "sharedUsGallon": "Amerikan Galonu",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Harita Durumunu Getir",
+ "sharedComputedAttribute": "Hesaplanmış Nitelik",
+ "sharedComputedAttributes": "Hesaplanmış Nitelikler",
+ "sharedCheckComputedAttribute": "Hesaplanmış Nitelikleri Kontrol Et",
+ "sharedExpression": "İfade",
+ "sharedDevice": "Cihaz",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Deneme bildirimi gönder",
+ "sharedTestNotificators": "Test Kanalları",
+ "sharedTestExpression": "Test İfadesi",
+ "sharedCalendar": "Takvim",
+ "sharedCalendars": "Takvimler",
+ "sharedFile": "Dosya",
+ "sharedSearchDevices": "Cihaz Arama",
+ "sharedSortBy": "Göre sırala",
+ "sharedFilterMap": "Haritada Filtrele",
+ "sharedSelectFile": "Dosya Seçin",
+ "sharedPhone": "Telefon",
+ "sharedRequired": "Gerekli",
+ "sharedPreferences": "Özellikler",
+ "sharedPermissions": "Yetkiler",
+ "sharedConnections": "Bağlantılar",
+ "sharedExtra": "Ekstra",
+ "sharedPrimary": "Birincil",
+ "sharedSecondary": "İkincil",
+ "sharedTypeString": "Akış",
+ "sharedTypeNumber": "Sayı",
+ "sharedTypeBoolean": "Evet - Hayır",
+ "sharedTimezone": "Saat dilimi",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Komut Kaydet",
+ "sharedSavedCommands": "Komutları Kaydet",
+ "sharedNew": "Yeni",
+ "sharedShowAddress": "Adresi Göster",
+ "sharedShowDetails": "Daha fazla detay",
+ "sharedDisabled": "Devre Dışı",
+ "sharedMaintenance": "Bakım",
+ "sharedDeviceAccumulators": "Akümülatörler",
+ "sharedAlarms": "Alarmlar",
+ "sharedLocation": "Konum",
+ "sharedImport": "İçe aktarmak",
+ "sharedColumns": "Sütunlar",
+ "sharedDropzoneText": "Bir dosyayı buraya sürükleyip bırakın veya tıklayın",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Basit",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Bir kere",
+ "calendarDaily": "Günlük",
+ "calendarWeekly": "Haftalık",
+ "calendarMonthly": "Aylık",
+ "calendarDays": "Gün",
+ "calendarSunday": "Pazar",
+ "calendarMonday": "Pazartesi",
+ "calendarTuesday": "Salı",
+ "calendarWednesday": "Çarşamba",
+ "calendarThursday": "Perşembe",
+ "calendarFriday": "Cuma",
+ "calendarSaturday": "Cumartesi",
+ "attributeShowGeofences": "Coğrafi Sınırları Göster",
+ "attributeSpeedLimit": "Hız Limiti",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Çizgi uzaklığı",
+ "attributeReportIgnoreOdometer": "Rapor: Odometerı yoksay",
+ "attributeWebReportColor": "Web: Rapor Rengi",
+ "attributeDevicePassword": "Araç şifresi",
+ "attributeDeviceImage": "Cihaz Resmi",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "İşleniyor: Nitelikler Kopyalanıyor",
+ "attributeColor": "Renk",
+ "attributeWebLiveRouteLength": "Web: Rota Uzunluğu",
+ "attributeWebSelectZoom": "Web: Seçiliye Yaklaş",
+ "attributeWebMaxZoom": "Web: Maksimum Yakınlaştırma",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Eposta: SMTP Sunucu",
+ "attributeMailSmtpPort": "Eposta: SMTP Port",
+ "attributeMailSmtpStarttlsEnable": "Eposta: SMTP STARTTLS Kullan",
+ "attributeMailSmtpStarttlsRequired": "Eposta: SMTP STARTTLS Gerekli",
+ "attributeMailSmtpSslEnable": "Eposta: SMTP SSL Kullan",
+ "attributeMailSmtpSslTrust": "Eposta: SMTP SSL Güvenli",
+ "attributeMailSmtpSslProtocols": "Eposta: SMTP SSL Protokol",
+ "attributeMailSmtpFrom": "Eposta: SMTP Kimden",
+ "attributeMailSmtpAuth": "Eposta: SMTP Parola Etkin",
+ "attributeMailSmtpUsername": "Eposta: SMTP Kullanıcı Adı",
+ "attributeMailSmtpPassword": "Eposta: SMTP Şifre",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "Etkinlikler Devredışı",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "Görünüm: Sürücüler Devredışı",
+ "attributeUiDisableComputedAttributes": "Görünüm: Hesaplanmış Öznitelikler Devredışı",
+ "attributeUiDisableCalendars": "Görünüm: Takvim Devredışı",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "Konum Özniteliklerini Gizle",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Hata",
+ "errorGeneral": "Geçersiz parametre veya kısıtlama ihlali",
+ "errorConnection": "Bağlantı Hatası",
+ "errorSocket": "Web Soketine bağlanırken hata",
+ "errorZero": "Sıfır olamaz",
+ "userEmail": "Eposta",
+ "userPassword": "Şifre",
+ "userAdmin": "Yönetici",
+ "userRemember": "Hatırla",
+ "userExpirationTime": "Geçersizlik Tarihi",
+ "userDeviceLimit": "Cihaz Limiti",
+ "userUserLimit": "Kullanıcı Limiti",
+ "userDeviceReadonly": "Cihaz Salt Okunur",
+ "userLimitCommands": "Komutları Kısıtla",
+ "userDisableReports": "Raporları Devre Dışı Bırak",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Kullanıcı Anahtarı",
+ "userDeleteAccount": "Hesabı sil",
+ "userTemporary": "Temporary",
+ "loginTitle": "Oturum aç",
+ "loginLanguage": "Lisan",
+ "loginReset": "Şifreyi yenile",
+ "loginRegister": "Kayıt",
+ "loginLogin": "Oturumu aç",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Geçersiz eposta veya şifre",
+ "loginCreated": "Yeni kullanıcı kaydedildi",
+ "loginResetSuccess": "E-postanı kontrol et",
+ "loginUpdateSuccess": "Yeni şifre belirlendi",
+ "loginLogout": "Oturumu sonlandır",
+ "loginLogo": "Logo",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Cihazlar ve Bölge",
+ "deviceSelected": "Seçilen Cihaz",
+ "deviceTitle": "Cihazlar",
+ "devicePrimaryInfo": "Cihaz Başlığı",
+ "deviceSecondaryInfo": "Cihaz Detayı",
+ "deviceIdentifier": "Kimlik",
+ "deviceModel": "Model",
+ "deviceContact": "İletişim",
+ "deviceCategory": "Kategori",
+ "deviceLastUpdate": "Son Güncelleme",
+ "deviceCommand": "Komut",
+ "deviceFollow": "Takip",
+ "deviceTotalDistance": "Toplam Mesafe",
+ "deviceStatus": "Durum",
+ "deviceStatusOnline": "Çevrimiçi",
+ "deviceStatusOffline": "Çevrimdışı",
+ "deviceStatusUnknown": "Bilinmeyen",
+ "deviceRegisterFirst": "İlk cihazınızı kaydedin",
+ "deviceIdentifierHelp": "IMEI, seri numarası veya diğer kimlik. Tanımlayıcı cihaz raporlarını sunucuyla eşleştirmesi gerekir.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Grup",
+ "groupParent": "Grup",
+ "groupNoGroup": "Grupsuz",
+ "settingsTitle": "Ayarlar",
+ "settingsUser": "Hesap",
+ "settingsGroups": "Gruplar",
+ "settingsServer": "Sunucu",
+ "settingsUsers": "Kullanıcı",
+ "settingsDistanceUnit": "Uzaklık Birimi",
+ "settingsAltitudeUnit": "Rakım Birimi",
+ "settingsSpeedUnit": "Hız Birimi",
+ "settingsVolumeUnit": "Hacim Birimi",
+ "settingsTwelveHourFormat": "12 saat formatı",
+ "settingsCoordinateFormat": "Koordinat Formatı",
+ "settingsServerVersion": "Sunucu Sürümü",
+ "settingsAppVersion": "Uygulama sürümü",
+ "settingsConnection": "Bağlantı",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Raporlar",
+ "reportScheduled": "Planlanmış Raporlar",
+ "reportDevice": "Aygıt",
+ "reportGroup": "Grup",
+ "reportFrom": "Başlangıç",
+ "reportTo": "Varış",
+ "reportShow": "Göster",
+ "reportClear": "Temizle",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Cihaz Saati",
+ "positionServerTime": "Sunucu zamanı",
+ "positionValid": "Geçerli",
+ "positionAccuracy": "Hata Payı",
+ "positionLatitude": "Enlem",
+ "positionLongitude": "Boylam",
+ "positionAltitude": "Rakım",
+ "positionSpeed": "Sürat",
+ "positionCourse": "Yön",
+ "positionAddress": "Adres",
+ "positionProtocol": "Protokol",
+ "positionDistance": "Mesafe",
+ "positionRpm": "RPM",
+ "positionFuel": "Yakıt",
+ "positionPower": "Güç",
+ "positionBattery": "Batarya",
+ "positionRaw": "Ham",
+ "positionIndex": "Indeks",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Uydu",
+ "positionSatVisible": "Görünür Uydu",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Dolaşım",
+ "positionEvent": "Etkinlik",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Durum",
+ "positionOdometer": "Kilometre Sayacı",
+ "positionServiceOdometer": "Kilometre Sayacı Hizmeti",
+ "positionTripOdometer": "Kilometre Sayacı Turu",
+ "positionHours": "Saat",
+ "positionSteps": "Adım",
+ "positionInput": "Giren",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Çıkan",
+ "positionBatteryLevel": "Pil Seviyesi",
+ "positionFuelConsumption": "Yakıt Tüketimi",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Versiyonu",
+ "positionVersionHw": "Hardware Versiyonu",
+ "positionIgnition": "Kontak",
+ "positionFlags": "Etiketler",
+ "positionCharge": "Şarz",
+ "positionIp": "IP",
+ "positionArchive": "Arşiv",
+ "positionVin": "VIN",
+ "positionApproximate": "Yaklaşık",
+ "positionThrottle": "Kısıtlama",
+ "positionMotion": "Hareket",
+ "positionArmed": "Hazır",
+ "positionAcceleration": "Hızlanma",
+ "positionTemp": "Sıcaklık",
+ "positionDeviceTemp": "Cihaz Sıcaklığı",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operatör",
+ "positionCommand": "Komut",
+ "positionBlocked": "Bloke Edildi",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Hız",
+ "positionObdOdometer": "OBD Kilometre Sayacı",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Benzersiz Sürücü Kimliği",
+ "positionCard": "Card",
+ "positionImage": "Görüntü",
+ "positionVideo": "Video",
+ "positionAudio": "Ses",
+ "serverTitle": "Sunucu Ayarları",
+ "serverZoom": "Yakınlaştırma",
+ "serverRegistration": "Kayıt",
+ "serverReadonly": "Sadece Okunur",
+ "serverForceSettings": "Zorunlu Ayarlar",
+ "serverAnnouncement": "Duyuru",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Harita",
+ "mapActive": "Aktif Haritalar",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Harita Katmanı",
+ "mapCustom": "Özel (XYZ)",
+ "mapCustomArcgis": "Özel (ArcGIS)",
+ "mapCustomLabel": "Özel harita",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Çokgen",
+ "mapShapeCircle": "Çember",
+ "mapShapePolyline": "Çizim",
+ "mapLiveRoutes": "Canlı Takip",
+ "mapDirection": "Yönü Göster",
+ "mapCurrentLocation": "Mevcut konum",
+ "mapPoiLayer": "POI Katmanı",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Seçimde Haritayı Göster",
+ "mapDefault": "Varsayılan Harita",
+ "stateTitle": "Bölge",
+ "stateName": "Özellik",
+ "stateValue": "Değer",
+ "commandTitle": "Komut",
+ "commandSend": "Gönder",
+ "commandSent": "Komut gönderildi",
+ "commandQueued": "Komut sıraya alındı",
+ "commandUnit": "Ünite",
+ "commandCustom": "Özel komut",
+ "commandDeviceIdentification": "Cihaz Tanımı",
+ "commandPositionSingle": "Tekil Raporlama",
+ "commandPositionPeriodic": "Periyodik Rapor",
+ "commandPositionStop": "Raporlamayı Durdur",
+ "commandEngineStop": "Motoru Durdur",
+ "commandEngineResume": "Motoru Çalıştır",
+ "commandAlarmArm": "Alarm Kur",
+ "commandAlarmDisarm": "Alarmı Kapat",
+ "commandAlarmDismiss": "Alarmı Kapat",
+ "commandSetTimezone": "Zaman Dilimini Belirle",
+ "commandRequestPhoto": "Fotoğraf İste",
+ "commandPowerOff": "Cihazı Kapatın",
+ "commandRebootDevice": "Aygıtı Yeniden Başlat",
+ "commandFactoryReset": "Fabrika Ayarları",
+ "commandSendSms": "SMS Gönder",
+ "commandSendUssd": "USSD Gönder",
+ "commandSosNumber": "Acil Durum Numarasını Belirle",
+ "commandSilenceTime": "Sessiz Zamanı Belirle",
+ "commandSetPhonebook": "Telefon Defterini Belirle",
+ "commandVoiceMessage": "Ses Mesajı",
+ "commandOutputControl": "Çıkış Kontrolü",
+ "commandVoiceMonitoring": "Ses İzleme",
+ "commandSetAgps": "AGPS Ayarla",
+ "commandSetIndicator": "Belirteci Ayarla",
+ "commandConfiguration": "Konfigürasyon",
+ "commandGetVersion": "Sürüm Al",
+ "commandFirmwareUpdate": "Aygıt Yazılımı Güncelle",
+ "commandSetConnection": "Bağlantı Ayarla",
+ "commandSetOdometer": "Kilometre Sayacı Ayarla",
+ "commandGetModemStatus": "Modem Durumunu Al",
+ "commandGetDeviceStatus": "Cihaz Durumunu Al",
+ "commandSetSpeedLimit": "Hız Sınırını Ayarla",
+ "commandModePowerSaving": "Enerji Tasarrufu Modu",
+ "commandModeDeepSleep": "Derin Uyku Modu",
+ "commandAlarmGeofence": "Coğrafi Sınır Alarmını Ayarla",
+ "commandAlarmBattery": "Pil Alarmını Ayarla",
+ "commandAlarmSos": "SOS Alarmını Ayarla",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Saat Alarmını Ayarla",
+ "commandAlarmSpeed": "Hız Alarmını Ayarla",
+ "commandAlarmFall": "Düşme Alarmını Ayarla",
+ "commandAlarmVibration": "Titreşim Alarmını Ayarla",
+ "commandFrequency": "Frekans",
+ "commandTimezone": "Saat Dilimi Dışında",
+ "commandMessage": "Mesaj",
+ "commandRadius": "Yarıçap",
+ "commandEnable": "Etkinleştir",
+ "commandData": "Veri",
+ "commandIndex": "Fihrist",
+ "commandPhone": "Telefon Numarası",
+ "commandServer": "Sunucu",
+ "commandPort": "Port",
+ "eventAll": "Tüm Olaylar",
+ "eventDeviceOnline": "Durumu çevrimiçi",
+ "eventDeviceUnknown": "Durumu bilinmiyor",
+ "eventDeviceOffline": "Durum çevrimdışı",
+ "eventDeviceInactive": "Cihaz etkin değil",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Cihaz hareket halinde",
+ "eventDeviceStopped": "Cihaz hareket etmiyor",
+ "eventDeviceOverspeed": "Hız limiti aşıldı",
+ "eventDeviceFuelDrop": "Yakıt düştü",
+ "eventDeviceFuelIncrease": "Yakıt artışı",
+ "eventCommandResult": "Komut sonucu",
+ "eventGeofenceEnter": "Coğrafik çite girildi",
+ "eventGeofenceExit": "Coğrafik çitden çıkıldı",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Kontak açık",
+ "eventIgnitionOff": "Kontak kapalı",
+ "eventMaintenance": "Bakım Gerekli",
+ "eventTextMessage": "Kısa mesaj alındı",
+ "eventDriverChanged": "Sürücü değişti",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Sona Git",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Genel",
+ "alarmSos": "Acil Yardım",
+ "alarmVibration": "Sarsıntı",
+ "alarmMovement": "Hareket",
+ "alarmLowspeed": "Düşük Hız",
+ "alarmOverspeed": "Aşırı Hız",
+ "alarmFallDown": "Düşmek",
+ "alarmLowPower": "Düşük Güç",
+ "alarmLowBattery": "Düşük pil",
+ "alarmFault": "Arıza",
+ "alarmPowerOff": "Kapalı",
+ "alarmPowerOn": "Çalışıyor",
+ "alarmDoor": "Kapı",
+ "alarmLock": "Kilit acık",
+ "alarmUnlock": "Kilit kapalı",
+ "alarmGeofence": "Coğrafik çit",
+ "alarmGeofenceEnter": "Coğrafik çite girildi",
+ "alarmGeofenceExit": "Coğrafik çitden çıkıldı",
+ "alarmGpsAntennaCut": "GPS Anteni Kes",
+ "alarmAccident": "Kaza",
+ "alarmTow": "Çekme",
+ "alarmIdle": "Çalışmıyor",
+ "alarmHighRpm": "Yüksek devir",
+ "alarmHardAcceleration": "Ani Hızlanma",
+ "alarmHardBraking": "Ani Yavaşlama",
+ "alarmHardCornering": "Sert Viraj",
+ "alarmLaneChange": "Şerit Değiştirme",
+ "alarmFatigueDriving": "Yorgun Sürücü",
+ "alarmPowerCut": "Enerji kesildi",
+ "alarmPowerRestored": "Enerji geldi",
+ "alarmJamming": "Sıkışıklık",
+ "alarmTemperature": "Hararet",
+ "alarmParking": "Park halinde",
+ "alarmBonnet": "Kaput",
+ "alarmFootBrake": "Ayak freni",
+ "alarmFuelLeak": "Yakıt sızıntısı",
+ "alarmTampering": "Kurcalama",
+ "alarmRemoving": "Çıkarma",
+ "notificationType": "Bildirim tipi",
+ "notificationAlways": "Tüm Cihazlar",
+ "notificationNotificators": "Kanallar",
+ "notificatorCommand": "Emir",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Eposta",
+ "notificatorSms": "SMS Mesajı",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Tekrar oynat",
+ "reportCombined": "Kombine",
+ "reportRoute": "Rota",
+ "reportEvents": "Olaylar",
+ "reportTrips": "Turlar",
+ "reportStops": "Stops",
+ "reportSummary": "Özet",
+ "reportDaily": "Günlük Özet",
+ "reportChart": "Grafik",
+ "reportConfigure": "Ayarlar",
+ "reportEventTypes": "Olay Tipleri",
+ "reportChartType": "Grafik Tipi",
+ "reportShowMarkers": "İşaretleri Göster",
+ "reportExport": "Çıktı Al",
+ "reportEmail": "Eposta Rapor",
+ "reportSchedule": "Takvim",
+ "reportPeriod": "Dönem",
+ "reportCustom": "Özel",
+ "reportToday": "Bugün",
+ "reportYesterday": "Dün",
+ "reportThisWeek": "Bu Hafta",
+ "reportPreviousWeek": "Geçen Hafta",
+ "reportThisMonth": "Bu Ay",
+ "reportPreviousMonth": "Geçen Ay",
+ "reportDeviceName": "Cihaz İsmi",
+ "reportAverageSpeed": "Ortalama Hız",
+ "reportMaximumSpeed": "En Fazla Hız",
+ "reportEngineHours": "Motor Saatleri",
+ "reportDuration": "Süre",
+ "reportStartDate": "Başlangıç ​​Tarihi",
+ "reportStartTime": "Başlama Zamanı",
+ "reportStartAddress": "Başlama Adresi",
+ "reportEndTime": "Bittiği Zaman",
+ "reportEndAddress": "Bittiği Adres",
+ "reportSpentFuel": "Tüketilen Yakıt",
+ "reportStartOdometer": "Kilometre Sayacı Başlangıçı",
+ "reportEndOdometer": "Kilometre Sayacı Sonu",
+ "statisticsTitle": "Statistics",
+ "statisticsCaptureTime": "Yakalama Zamanı",
+ "statisticsActiveUsers": "Aktif Kullanıcılar",
+ "statisticsActiveDevices": "Aktif Cihazlar",
+ "statisticsRequests": "İstenilenler",
+ "statisticsMessagesReceived": "Mesajlar Alındı",
+ "statisticsMessagesStored": "Mesajlar Kaydedildi",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Yön",
+ "categoryDefault": "Varsayılan",
+ "categoryAnimal": "Hayvan",
+ "categoryBicycle": "Bisiklet",
+ "categoryBoat": "Tekne",
+ "categoryBus": "Otobüs",
+ "categoryCar": "Araba",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Vinç",
+ "categoryHelicopter": "Helikopter",
+ "categoryMotorcycle": "Motorsiklet",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "İnsan",
+ "categoryPickup": "Kamyonet",
+ "categoryPlane": "Uçak",
+ "categoryShip": "Gemi",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Tren",
+ "categoryTram": "Tramvay",
+ "categoryTrolleybus": "Troleybüs",
+ "categoryTruck": "Kamyon",
+ "categoryVan": "Van",
+ "categoryScooter": "Mobilet",
+ "maintenanceStart": "Başlat",
+ "maintenancePeriod": "Dönem"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/uk.json b/legacy/web/l10n/uk.json
new file mode 100644
index 00000000..5e013dc6
--- /dev/null
+++ b/legacy/web/l10n/uk.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Завантаження... ",
+ "sharedHide": "Приховувати",
+ "sharedSave": "Зберегти",
+ "sharedUpload": "Upload",
+ "sharedSet": "Встановити",
+ "sharedCancel": "Відміна",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Додати",
+ "sharedEdit": "Редагувати",
+ "sharedRemove": "Видалити",
+ "sharedRemoveConfirm": "Видалити пункт?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "км",
+ "sharedMi": "Милi",
+ "sharedNmi": "морська миля",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "Вузли",
+ "sharedKmh": "км/год",
+ "sharedMph": "Миль/год",
+ "sharedHour": "Години",
+ "sharedMinute": "Хвилини",
+ "sharedSecond": "Секунди",
+ "sharedDays": "днів",
+ "sharedHours": "годин",
+ "sharedMinutes": "хвилин",
+ "sharedDecimalDegrees": "Градуси°",
+ "sharedDegreesDecimalMinutes": "Градуси° хвилини′",
+ "sharedDegreesMinutesSeconds": "Градуси° хвилини′ секунди″",
+ "sharedName": "Назва пристрою",
+ "sharedDescription": "Опис",
+ "sharedSearch": "Пошук",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Геозон",
+ "sharedGeofences": "Геозони",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Повідомлення",
+ "sharedNotification": "Повідомлення",
+ "sharedAttributes": "Атрибути",
+ "sharedAttribute": "Атрибут",
+ "sharedDrivers": "Водії",
+ "sharedDriver": "Водій",
+ "sharedArea": "Площа",
+ "sharedSound": "Звукове повідомлення",
+ "sharedType": "Тип",
+ "sharedDistance": "Відстань",
+ "sharedHourAbbreviation": "г",
+ "sharedMinuteAbbreviation": "хв",
+ "sharedSecondAbbreviation": "c",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Літр",
+ "sharedImpGallon": "Імп. галон",
+ "sharedUsGallon": "Галон США",
+ "sharedLiterPerHourAbbreviation": "л/ч",
+ "sharedGetMapState": "Отримати стан карти",
+ "sharedComputedAttribute": "Обчислюваний атрибут",
+ "sharedComputedAttributes": "Обчислювані атрибути",
+ "sharedCheckComputedAttribute": "Перевірити обчислюваний атрибут",
+ "sharedExpression": "Вираз",
+ "sharedDevice": "Пристрій",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Відправити тестове повідомлення",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Календар",
+ "sharedCalendars": "Календарi",
+ "sharedFile": "Файл",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Вибрати файл",
+ "sharedPhone": "Телефон",
+ "sharedRequired": "Обов'язкові",
+ "sharedPreferences": "Налаштування",
+ "sharedPermissions": "Дозволи",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Екстра",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Строка",
+ "sharedTypeNumber": "Число",
+ "sharedTypeBoolean": "Логічне значення",
+ "sharedTimezone": "Часовий пояс",
+ "sharedInfoTitle": "Інфо",
+ "sharedSavedCommand": "Збережена команда",
+ "sharedSavedCommands": "Збережені команди",
+ "sharedNew": "Новий…",
+ "sharedShowAddress": "Показати адрес",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Вимкнутий",
+ "sharedMaintenance": "Обслуговування",
+ "sharedDeviceAccumulators": "Акумулятори",
+ "sharedAlarms": "Тривоги",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Обмеження швидкості",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Відстань від лінії",
+ "attributeReportIgnoreOdometer": "Звіт: Ігнорувати одометер",
+ "attributeWebReportColor": "Веб: Колір звіту",
+ "attributeDevicePassword": "Пароль пристрою",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Обробка: Копіювання атрибутів",
+ "attributeColor": "Колір",
+ "attributeWebLiveRouteLength": "Веб: Довжина онлайн маршруту",
+ "attributeWebSelectZoom": "Веб: Збільшення при виборі",
+ "attributeWebMaxZoom": "Веб: Максимальне збільшення",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Пошта: SMTP хост",
+ "attributeMailSmtpPort": "Пошта: SMTP порт",
+ "attributeMailSmtpStarttlsEnable": "Пошта: увімкнути SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "Пошта: потрібен SMTP STARTTLS",
+ "attributeMailSmtpSslEnable": "Пошта: увімкнути SMTP SSL",
+ "attributeMailSmtpSslTrust": "Пошта: довіра SMTP SSL",
+ "attributeMailSmtpSslProtocols": "Пошта: Протоколи SMTP SSL",
+ "attributeMailSmtpFrom": "Пошта: SMTP відправник",
+ "attributeMailSmtpAuth": "Пошта: Увімкнути SMTP Auth",
+ "attributeMailSmtpUsername": "Пошта: SMTP ім'я користувача",
+ "attributeMailSmtpPassword": "Пошта: SMTP пароль",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Вимкнути події",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Вимкнути водіїв",
+ "attributeUiDisableComputedAttributes": "UI: Вимкнути обчислювані атрибути",
+ "attributeUiDisableCalendars": "UI: Вимкнути календарі",
+ "attributeUiDisableMaintenance": "UI: Вимкнути обслуговування",
+ "attributeUiHidePositionAttributes": "UI: Приховувати атрибути",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Помилка",
+ "errorGeneral": "Неправильні параметри або порушення обмежень",
+ "errorConnection": "Помилка з'єднання",
+ "errorSocket": "Помилка web socket з'єднання",
+ "errorZero": "Не може бути нульовим",
+ "userEmail": "E-mail",
+ "userPassword": "Пароль",
+ "userAdmin": "Адмiнiстратор",
+ "userRemember": "Запам'ятати",
+ "userExpirationTime": "Термін дії",
+ "userDeviceLimit": "Обмеження пристроїв",
+ "userUserLimit": "Обмеження користувачів",
+ "userDeviceReadonly": "Тільки перегляд пристроїв",
+ "userLimitCommands": "Обмеження команд",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Ключ",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Логiн",
+ "loginLanguage": "Мова",
+ "loginReset": "Reset Password",
+ "loginRegister": "Реєстрація",
+ "loginLogin": "Ввійти",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Неправильне адреса електронної пошти або пароль",
+ "loginCreated": "Новий користувач був зареєстрований",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Вийти",
+ "loginLogo": "Логотип",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Пристрої та стан",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": " Прилади",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Iдентифікатор",
+ "deviceModel": "Модель",
+ "deviceContact": "Контакт",
+ "deviceCategory": "Категорія",
+ "deviceLastUpdate": "Останнє оновлення",
+ "deviceCommand": "Команда",
+ "deviceFollow": "Слідувати",
+ "deviceTotalDistance": "Загальна відстань",
+ "deviceStatus": "Статус",
+ "deviceStatusOnline": "Онлайн",
+ "deviceStatusOffline": "Офлайн",
+ "deviceStatusUnknown": "Невідомий",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Група",
+ "groupParent": "Група",
+ "groupNoGroup": "Група відсутня",
+ "settingsTitle": "Налаштування",
+ "settingsUser": "Аккаунт",
+ "settingsGroups": "Групи",
+ "settingsServer": "Сервер",
+ "settingsUsers": "Користувачі",
+ "settingsDistanceUnit": "Одиниця відстані",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Одиниця швидкості",
+ "settingsVolumeUnit": "Одиниця об'єму",
+ "settingsTwelveHourFormat": "12-годинний формат",
+ "settingsCoordinateFormat": "Формат координат",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Звіти",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Пристрій ",
+ "reportGroup": "Група",
+ "reportFrom": "З",
+ "reportTo": "До",
+ "reportShow": "Показати",
+ "reportClear": "Очистити",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Дійсний",
+ "positionAccuracy": "Точність",
+ "positionLatitude": "Широта",
+ "positionLongitude": "Довгота ",
+ "positionAltitude": "Висота",
+ "positionSpeed": "Швидкість ",
+ "positionCourse": "Напрямок",
+ "positionAddress": "Адреса",
+ "positionProtocol": "Протокол",
+ "positionDistance": "Відстань",
+ "positionRpm": "Обороти",
+ "positionFuel": "Паливо",
+ "positionPower": "Живлення",
+ "positionBattery": "Батарея",
+ "positionRaw": "Cирі дані",
+ "positionIndex": "Індекс",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Супутники",
+ "positionSatVisible": "Видимі супутники",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Роумінг",
+ "positionEvent": "Подія",
+ "positionAlarm": "Тривога",
+ "positionStatus": "Статус",
+ "positionOdometer": "Одометр",
+ "positionServiceOdometer": "Одометр обслуговування",
+ "positionTripOdometer": "Одометр поїздки",
+ "positionHours": "Години",
+ "positionSteps": "Кроки",
+ "positionInput": "Входи",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Виходи",
+ "positionBatteryLevel": "Рівень заряду батареї",
+ "positionFuelConsumption": "Витрати палива",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Версія прошивки",
+ "positionVersionHw": "Версія пристрою",
+ "positionIgnition": "Запалення",
+ "positionFlags": "Флаги",
+ "positionCharge": "Заряд",
+ "positionIp": "IP",
+ "positionArchive": "Архів",
+ "positionVin": "VIN",
+ "positionApproximate": "Приблизний",
+ "positionThrottle": "Дросель",
+ "positionMotion": "Рух",
+ "positionArmed": "Охорона",
+ "positionAcceleration": "Прискорення",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Температура пристрою",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Оператор",
+ "positionCommand": "Команда",
+ "positionBlocked": "Блокування",
+ "positionDtcs": "Помилки",
+ "positionObdSpeed": "OBD швидкість",
+ "positionObdOdometer": "OBD одометр",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "ID водія",
+ "positionCard": "Card",
+ "positionImage": "Зображення",
+ "positionVideo": "Video",
+ "positionAudio": "Аудіо",
+ "serverTitle": "Налаштування сервера",
+ "serverZoom": "Наближення",
+ "serverRegistration": "Реєстрація",
+ "serverReadonly": "Лише для читання",
+ "serverForceSettings": "Налаштування Force",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Карта",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Використання мап",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Ключ Bing Maps ",
+ "mapBingRoad": "Bing Maps Дороги",
+ "mapBingAerial": "Bing Maps Супутник",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Багатокутник",
+ "mapShapeCircle": "Коло",
+ "mapShapePolyline": "Лінія",
+ "mapLiveRoutes": "Поточні маршрути",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "Шар POI",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Стан",
+ "stateName": "Атрибут",
+ "stateValue": "Значення ",
+ "commandTitle": "Команда ",
+ "commandSend": "Послати. ",
+ "commandSent": "Команда відправлена",
+ "commandQueued": "Команда додана в чергу",
+ "commandUnit": "Одиниці",
+ "commandCustom": "Користувацька команда",
+ "commandDeviceIdentification": "Ідентифікація пристрою",
+ "commandPositionSingle": "Разове відстеження",
+ "commandPositionPeriodic": "Періодична звітність",
+ "commandPositionStop": "Скасувати відстеження. ",
+ "commandEngineStop": "Заблокувати двигун ",
+ "commandEngineResume": "Розблокувати двигун",
+ "commandAlarmArm": "Активувати сигналізацію",
+ "commandAlarmDisarm": "Вимкнути сигналізацію",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Часовий пояс",
+ "commandRequestPhoto": "Запит фото",
+ "commandPowerOff": "Вимкнути пристрій",
+ "commandRebootDevice": "Перезавантаження пристрою",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Надсилання SMS",
+ "commandSendUssd": "Надсилання USSD",
+ "commandSosNumber": "Номер SOS",
+ "commandSilenceTime": "Встановити час пиші",
+ "commandSetPhonebook": "Телефонна книга",
+ "commandVoiceMessage": "Голосове повідомлення",
+ "commandOutputControl": "Контроль виходу",
+ "commandVoiceMonitoring": "Голосове повідомлення",
+ "commandSetAgps": "Налаштувати AGPS",
+ "commandSetIndicator": "Налаштувати ітдикатор",
+ "commandConfiguration": "Конфігурація",
+ "commandGetVersion": "Отримати версію",
+ "commandFirmwareUpdate": "Оновити прошивку",
+ "commandSetConnection": "Налаштувати з'єднання",
+ "commandSetOdometer": "Налаштувати одометр",
+ "commandGetModemStatus": "Отримати стан модема",
+ "commandGetDeviceStatus": "Отримати статус пристрою",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Частота",
+ "commandTimezone": "Зсув часової зони",
+ "commandMessage": "Повідомлення",
+ "commandRadius": "Радіус",
+ "commandEnable": "Увімкнути",
+ "commandData": "Дані",
+ "commandIndex": "Індекс",
+ "commandPhone": "Номер телефону",
+ "commandServer": "Сервер",
+ "commandPort": "Порт",
+ "eventAll": "Всі події",
+ "eventDeviceOnline": "Статус онлайн",
+ "eventDeviceUnknown": "Статус невідомий",
+ "eventDeviceOffline": "Статус офлайн",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Пристрій рухається",
+ "eventDeviceStopped": "Пристрій зупинився",
+ "eventDeviceOverspeed": "Перевищено обмеження швидкості",
+ "eventDeviceFuelDrop": "Злив палива",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Результат команди",
+ "eventGeofenceEnter": "Вхід в геозон",
+ "eventGeofenceExit": "Вихід з геозон",
+ "eventAlarm": "Тривога",
+ "eventIgnitionOn": "Запалення увімкнено",
+ "eventIgnitionOff": "Запалення вимкнено",
+ "eventMaintenance": "Потрібне обслуговування",
+ "eventTextMessage": "Текстове повідомлення отримано",
+ "eventDriverChanged": "Водій змінений",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Прокрутка до кінця",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "Загальне",
+ "alarmSos": "SOS",
+ "alarmVibration": "Вібрація",
+ "alarmMovement": "Рух",
+ "alarmLowspeed": "Низька швидкість",
+ "alarmOverspeed": "Перевищення швидкості",
+ "alarmFallDown": "Падіння",
+ "alarmLowPower": "Низький рівень живлення",
+ "alarmLowBattery": "Батарея розряджена",
+ "alarmFault": "Несправність",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Двері",
+ "alarmLock": "Блокування",
+ "alarmUnlock": "Разблокування",
+ "alarmGeofence": "Геозон",
+ "alarmGeofenceEnter": "Вхід в геозон",
+ "alarmGeofenceExit": "Вихід з геозон",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Тип повідомлення",
+ "notificationAlways": "Всi пристрої",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Маршрут",
+ "reportEvents": "Події",
+ "reportTrips": "Подорожі",
+ "reportStops": "Зупинки",
+ "reportSummary": "Звіт",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Діаграма",
+ "reportConfigure": "Конфігурувати",
+ "reportEventTypes": "Тип події",
+ "reportChartType": "Тип діаграми",
+ "reportShowMarkers": "Показати маркери",
+ "reportExport": "Експорт",
+ "reportEmail": "Звіт по пошті",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Період",
+ "reportCustom": "Користувальницький",
+ "reportToday": "Сьогодні",
+ "reportYesterday": "Вчора",
+ "reportThisWeek": "Поточний тиждень",
+ "reportPreviousWeek": "Попередній тиждень",
+ "reportThisMonth": "Поточний місяць",
+ "reportPreviousMonth": "Попередній місяць",
+ "reportDeviceName": "Ім'я пристрою",
+ "reportAverageSpeed": "Середня швидкість",
+ "reportMaximumSpeed": "Максимальна швидкість",
+ "reportEngineHours": "Мотогодинник",
+ "reportDuration": "Тривалість",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Початковий час",
+ "reportStartAddress": "Початкова адреса",
+ "reportEndTime": "Кінцевий час",
+ "reportEndAddress": "Кінцева адреса",
+ "reportSpentFuel": "Використано палива",
+ "reportStartOdometer": "Одометр, початок",
+ "reportEndOdometer": "Одометр, закінчення",
+ "statisticsTitle": "Статистика",
+ "statisticsCaptureTime": "Час збору",
+ "statisticsActiveUsers": "Активні користувачі",
+ "statisticsActiveDevices": "Активні пристрої",
+ "statisticsRequests": "Запити",
+ "statisticsMessagesReceived": "Отримано повідомлень",
+ "statisticsMessagesStored": "Збережено повідомлень",
+ "statisticsGeocoder": "Запити геокодера",
+ "statisticsGeolocation": "Запити геолокації",
+ "categoryArrow": "Стрілка",
+ "categoryDefault": "За замовчуванням",
+ "categoryAnimal": "Тварина",
+ "categoryBicycle": "Велосипед",
+ "categoryBoat": "Човен",
+ "categoryBus": "Автобус",
+ "categoryCar": "Автомобіль",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Кран",
+ "categoryHelicopter": "Гвинтокрил",
+ "categoryMotorcycle": "Мотоцикл",
+ "categoryOffroad": "Позашляховик",
+ "categoryPerson": "Людина",
+ "categoryPickup": "Пікап",
+ "categoryPlane": "Літак",
+ "categoryShip": "Корабель",
+ "categoryTractor": "Трактор",
+ "categoryTrain": "Поїзд",
+ "categoryTram": "Трамвай",
+ "categoryTrolleybus": "Тролейбус",
+ "categoryTruck": "Вантажний автомобіль",
+ "categoryVan": "Фургон",
+ "categoryScooter": "Скутер",
+ "maintenanceStart": "Початок",
+ "maintenancePeriod": "Період"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/uz.json b/legacy/web/l10n/uz.json
new file mode 100644
index 00000000..51b9364d
--- /dev/null
+++ b/legacy/web/l10n/uz.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Юкланмоқда...",
+ "sharedHide": "Беркитиш",
+ "sharedSave": "Сақлаш",
+ "sharedUpload": "Upload",
+ "sharedSet": "Ўрнатиш",
+ "sharedCancel": "Бекор қилиш",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Қўшиш",
+ "sharedEdit": "Таҳрирлаш",
+ "sharedRemove": "Ўчириш",
+ "sharedRemoveConfirm": "Элементни ўчирайми?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "км",
+ "sharedMi": "миллар",
+ "sharedNmi": "м.миллар",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "уз",
+ "sharedKmh": "км/с",
+ "sharedMph": "миль/с",
+ "sharedHour": "Соат",
+ "sharedMinute": "Дақиқалар",
+ "sharedSecond": "Сониялар",
+ "sharedDays": "days",
+ "sharedHours": "hours",
+ "sharedMinutes": "minutes",
+ "sharedDecimalDegrees": "Ўнлик даража",
+ "sharedDegreesDecimalMinutes": "Градуслар Ўнлик Дақиқалар",
+ "sharedDegreesMinutesSeconds": "Градуслар Дақиқалар Сониялар",
+ "sharedName": "Исм",
+ "sharedDescription": "Тавсиф",
+ "sharedSearch": "Қидирув",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Геозона",
+ "sharedGeofences": "Геозоналар",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Хабарнома",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "Атрибутлар",
+ "sharedAttribute": "Атрибут",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
+ "sharedArea": "Соҳа",
+ "sharedSound": "Notification Sound",
+ "sharedType": "Тур",
+ "sharedDistance": "Масофа",
+ "sharedHourAbbreviation": "с",
+ "sharedMinuteAbbreviation": "д",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Харита ҳолатини билиш",
+ "sharedComputedAttribute": "Computed Attribute",
+ "sharedComputedAttributes": "Computed Attributes",
+ "sharedCheckComputedAttribute": "Check Computed Attribute",
+ "sharedExpression": "Expression",
+ "sharedDevice": "Қурилма",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Send Test Notification",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Тақвим",
+ "sharedCalendars": "Тақвимлар",
+ "sharedFile": "Файл",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Файлни танлаш",
+ "sharedPhone": "Phone",
+ "sharedRequired": "Required",
+ "sharedPreferences": "Preferences",
+ "sharedPermissions": "Permissions",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Extra",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "String",
+ "sharedTypeNumber": "Number",
+ "sharedTypeBoolean": "Boolean",
+ "sharedTimezone": "Timezone",
+ "sharedInfoTitle": "Info",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Speed Limit",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Report: Ignore Odometer",
+ "attributeWebReportColor": "Web: Report Color",
+ "attributeDevicePassword": "Device Password",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Processing: Copy Attributes",
+ "attributeColor": "Color",
+ "attributeWebLiveRouteLength": "Web: Live Route Length",
+ "attributeWebSelectZoom": "Web: Zoom On Select",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Mail: SMTP Host",
+ "attributeMailSmtpPort": "Mail: SMTP Port",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Хато",
+ "errorGeneral": "Invalid parameters or constraints violation",
+ "errorConnection": "Уланишда хато",
+ "errorSocket": "Web socket connection error",
+ "errorZero": "Can't be zero",
+ "userEmail": "Email",
+ "userPassword": "Парол",
+ "userAdmin": "Маъмурият",
+ "userRemember": "Эслаб қолиш",
+ "userExpirationTime": "Хизмат муддати",
+ "userDeviceLimit": "Қурилманинг чекловлари",
+ "userUserLimit": "Фойдаланувчини чегаралаш",
+ "userDeviceReadonly": "Фақат кўриш",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Калит",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Кириш",
+ "loginLanguage": "Тил",
+ "loginReset": "Reset Password",
+ "loginRegister": "Рўйхатдан ўтиш",
+ "loginLogin": "Кириш",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Нотўғри email ёки пароль",
+ "loginCreated": "Янги фойдаланувчи рўйхатдан ўтди",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Чиқиш",
+ "loginLogo": "Логотип",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Қурилмалар ва Ҳолатлар",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Қурилмалар",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Идентификатор",
+ "deviceModel": "Модел",
+ "deviceContact": "Алоқа воситаси",
+ "deviceCategory": "Тоифа",
+ "deviceLastUpdate": "Сўнгги янгиланиш",
+ "deviceCommand": "Гуруҳ",
+ "deviceFollow": "Амал қилиш",
+ "deviceTotalDistance": "Умумий масофа",
+ "deviceStatus": "Status",
+ "deviceStatusOnline": "Online",
+ "deviceStatusOffline": "Offline",
+ "deviceStatusUnknown": "Unknown",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Гуруҳ",
+ "groupParent": "Гуруҳ",
+ "groupNoGroup": "Гуруҳсиз",
+ "settingsTitle": "Созламалар",
+ "settingsUser": "Аккаунт",
+ "settingsGroups": "Гуруҳлар",
+ "settingsServer": "Сервер",
+ "settingsUsers": "Фойдаланувчилар",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "12-соатли формат",
+ "settingsCoordinateFormat": "Координаталар формати",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Ҳисоботлар",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Қурилма",
+ "reportGroup": "Гуруҳ",
+ "reportFrom": "дан",
+ "reportTo": "гача",
+ "reportShow": "Кўрсатиш",
+ "reportClear": "Тозалаш",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Аниқлик",
+ "positionAccuracy": "Аниқлик",
+ "positionLatitude": "Кенглик",
+ "positionLongitude": "Узунлик",
+ "positionAltitude": "Баландлик",
+ "positionSpeed": "Тезлик",
+ "positionCourse": "Йўналиш",
+ "positionAddress": "Манзил",
+ "positionProtocol": "Баённома",
+ "positionDistance": "Оралиқ масофа",
+ "positionRpm": "RPM",
+ "positionFuel": "Fuel",
+ "positionPower": "Power",
+ "positionBattery": "Battery",
+ "positionRaw": "Raw",
+ "positionIndex": "Index",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Event",
+ "positionAlarm": "Alarm",
+ "positionStatus": "Status",
+ "positionOdometer": "Odometer",
+ "positionServiceOdometer": "Service Odometer",
+ "positionTripOdometer": "Trip Odometer",
+ "positionHours": "Hours",
+ "positionSteps": "Steps",
+ "positionInput": "Input",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Output",
+ "positionBatteryLevel": "Battery Level",
+ "positionFuelConsumption": "Fuel Consumption",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Firmware Version",
+ "positionVersionHw": "Hardware Version",
+ "positionIgnition": "Ignition",
+ "positionFlags": "Flags",
+ "positionCharge": "Charge",
+ "positionIp": "IP",
+ "positionArchive": "Archive",
+ "positionVin": "VIN",
+ "positionApproximate": "Approximate",
+ "positionThrottle": "Throttle",
+ "positionMotion": "Motion",
+ "positionArmed": "Armed",
+ "positionAcceleration": "Acceleration",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Device Temperature",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Command",
+ "positionBlocked": "Blocked",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "OBD Speed",
+ "positionObdOdometer": "OBD Odometer",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Сервер созламалари",
+ "serverZoom": "Яқинлаштириш",
+ "serverRegistration": "Рўйхатдан ўтиш",
+ "serverReadonly": "Фақат кўриш",
+ "serverForceSettings": "Созламаларни кучайтириш",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Харита",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Харита қавати",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps калити",
+ "mapBingRoad": "Bing Maps йўллар",
+ "mapBingAerial": "Bing Maps Спутник",
+ "mapBingHybrid": "Bing Maps Hybrid",
+ "mapBaidu": "Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Yandex Map",
+ "mapYandexSat": "Yandex Satellite",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Кўпбурчак",
+ "mapShapeCircle": "Айлана",
+ "mapShapePolyline": "Чизиқ",
+ "mapLiveRoutes": "Амалдаги маршрутлар",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Ҳолат",
+ "stateName": "Параметр",
+ "stateValue": "Маъноси",
+ "commandTitle": "Буйруқ",
+ "commandSend": "Жўнатиш",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "Бирликлар",
+ "commandCustom": "Фойдаланувчи буйруғи",
+ "commandDeviceIdentification": "Қурилма идентификацияси",
+ "commandPositionSingle": "Бир марта кузатиш",
+ "commandPositionPeriodic": "Кузатувни бошлаш",
+ "commandPositionStop": "Кузатувни бекор қилиш",
+ "commandEngineStop": "Двигателни блокировка қилиш",
+ "commandEngineResume": "Двигателдан блокировкани ечиш",
+ "commandAlarmArm": "Сигнализацияни активлаштириш",
+ "commandAlarmDisarm": "Сигнализация активлигини бекор қилиш",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Соат қутбини созлаш",
+ "commandRequestPhoto": "Фото сўраш",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Қурилмани қайта юклаш",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "СМС жўнатиш",
+ "commandSendUssd": "USSD жўнатиш",
+ "commandSosNumber": "Шошилинч рақамни созлаш",
+ "commandSilenceTime": "Тинчлик вақтини созлаш",
+ "commandSetPhonebook": "Телефон дафтарини созлаш",
+ "commandVoiceMessage": "Товушли хабар",
+ "commandOutputControl": "Чиқиш назорати",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Set Indicator",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Частота",
+ "commandTimezone": "Соат қутбининг силжиши",
+ "commandMessage": "Хабар",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Маълумотлар",
+ "commandIndex": "Индекс",
+ "commandPhone": "Телефон рақами",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Барча воқеалар",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Буйруқ натижаси",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Хизмат кўрсатиш талаб этилади",
+ "eventTextMessage": "Text message received",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Scroll To Last",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Хабарнома тури",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Маршрут",
+ "reportEvents": "Ҳодисалар",
+ "reportTrips": "Сафарлар",
+ "reportStops": "Stops",
+ "reportSummary": "Маълумот",
+ "reportDaily": "Daily Summary",
+ "reportChart": "График",
+ "reportConfigure": "Конфигурациялаш",
+ "reportEventTypes": "Ҳодиса тури",
+ "reportChartType": "График тури",
+ "reportShowMarkers": "Маркетларни кўрсатиш",
+ "reportExport": "Экспорт",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "Қурилма номи",
+ "reportAverageSpeed": "Ўртача тезлик",
+ "reportMaximumSpeed": "Максимал тезлик",
+ "reportEngineHours": "Мотосоат",
+ "reportDuration": "Узунлиги",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Бошланиш вақти",
+ "reportStartAddress": "Бошланиш манзили",
+ "reportEndTime": "Тугаш вақти",
+ "reportEndAddress": "Сўнгги манзил",
+ "reportSpentFuel": "Ёқилғи сарфи",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Статистика",
+ "statisticsCaptureTime": "Йиғилиш вақти",
+ "statisticsActiveUsers": "Актив фойдаланувчилар",
+ "statisticsActiveDevices": "Актив қурилмалар",
+ "statisticsRequests": "Сўровлар",
+ "statisticsMessagesReceived": "Хабарлар қабул қилинган",
+ "statisticsMessagesStored": "Хабарлар сақланган",
+ "statisticsGeocoder": "Geocoder Requests",
+ "statisticsGeolocation": "Geolocation Requests",
+ "categoryArrow": "Стрелка",
+ "categoryDefault": "Сўзсиз",
+ "categoryAnimal": "Жонивор",
+ "categoryBicycle": "Велосипед",
+ "categoryBoat": "Boat",
+ "categoryBus": "Автобус",
+ "categoryCar": "Автомобиль",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Crane",
+ "categoryHelicopter": "Helicopter",
+ "categoryMotorcycle": "Мотоцикл",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Одам",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Самолёт",
+ "categoryShip": "Кема",
+ "categoryTractor": "Tractor",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Юк автомобили",
+ "categoryVan": "Van",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/vi.json b/legacy/web/l10n/vi.json
new file mode 100644
index 00000000..87f0e236
--- /dev/null
+++ b/legacy/web/l10n/vi.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "Đang tải...",
+ "sharedHide": "Ẩn",
+ "sharedSave": "Lưu",
+ "sharedUpload": "Upload",
+ "sharedSet": "Thiết lập",
+ "sharedCancel": "Hủy",
+ "sharedCopy": "Copy",
+ "sharedAdd": "Thêm mới",
+ "sharedEdit": "Chỉnh sửa",
+ "sharedRemove": "Xóa",
+ "sharedRemoveConfirm": "Xóa lựa chọn?",
+ "sharedNoData": "No data",
+ "sharedSubject": "Subject",
+ "sharedYes": "Yes",
+ "sharedNo": "No",
+ "sharedKm": "km",
+ "sharedMi": "dặm",
+ "sharedNmi": "nmi",
+ "sharedMeters": "m",
+ "sharedFeet": "ft",
+ "sharedKn": "kn",
+ "sharedKmh": "km/h",
+ "sharedMph": "mph",
+ "sharedHour": "Giờ",
+ "sharedMinute": "Phút",
+ "sharedSecond": "Giây",
+ "sharedDays": "Ngày",
+ "sharedHours": "Giờ",
+ "sharedMinutes": "Phút",
+ "sharedDecimalDegrees": "Độ thập phân",
+ "sharedDegreesDecimalMinutes": "Độ thập phân phút",
+ "sharedDegreesMinutesSeconds": "Độ thập phân giây",
+ "sharedName": "Tên",
+ "sharedDescription": "Mô tả",
+ "sharedSearch": "Tìm kiếm",
+ "sharedIconScale": "Icon Scale",
+ "sharedGeofence": "Giới hạn địa lý",
+ "sharedGeofences": "Giới hạn địa lý",
+ "sharedCreateGeofence": "Create Geofence",
+ "sharedNotifications": "Thông báo",
+ "sharedNotification": "Notification",
+ "sharedAttributes": "Thuộc tính",
+ "sharedAttribute": "Thuộc tính",
+ "sharedDrivers": "Drivers",
+ "sharedDriver": "Driver",
+ "sharedArea": "Khu vực",
+ "sharedSound": "Tiếng thông báo",
+ "sharedType": "Loại",
+ "sharedDistance": "Khoảng cách",
+ "sharedHourAbbreviation": "h",
+ "sharedMinuteAbbreviation": "m",
+ "sharedSecondAbbreviation": "s",
+ "sharedVoltAbbreviation": "V",
+ "sharedLiterAbbreviation": "l",
+ "sharedGallonAbbreviation": "gal",
+ "sharedLiter": "Liter",
+ "sharedImpGallon": "Imp. Gallon",
+ "sharedUsGallon": "U.S. Gallon",
+ "sharedLiterPerHourAbbreviation": "l/h",
+ "sharedGetMapState": "Lấy trạng thái bản đồ",
+ "sharedComputedAttribute": "Tính toán thuộc tính",
+ "sharedComputedAttributes": "Tính toán thuộc tính",
+ "sharedCheckComputedAttribute": "Kiểm tra tính toán thuộc tính",
+ "sharedExpression": "Truyền",
+ "sharedDevice": "Thiết bị",
+ "sharedTest": "Test",
+ "sharedTestNotification": "Gửi thông báo thử",
+ "sharedTestNotificators": "Test Channels",
+ "sharedTestExpression": "Test Expression",
+ "sharedCalendar": "Lịch",
+ "sharedCalendars": "Lịch",
+ "sharedFile": "Tập tin",
+ "sharedSearchDevices": "Search Devices",
+ "sharedSortBy": "Sort By",
+ "sharedFilterMap": "Filter on Map",
+ "sharedSelectFile": "Lựa chọn tập tin",
+ "sharedPhone": "Điện thoại",
+ "sharedRequired": "Bắt buộc",
+ "sharedPreferences": "Ưu tiên",
+ "sharedPermissions": "Cấp phép",
+ "sharedConnections": "Connections",
+ "sharedExtra": "Thêm vào",
+ "sharedPrimary": "Primary",
+ "sharedSecondary": "Secondary",
+ "sharedTypeString": "Chuỗi",
+ "sharedTypeNumber": "Số",
+ "sharedTypeBoolean": "Toán tử",
+ "sharedTimezone": "Múi giờ",
+ "sharedInfoTitle": "Thông tin",
+ "sharedSavedCommand": "Saved Command",
+ "sharedSavedCommands": "Saved Commands",
+ "sharedNew": "New…",
+ "sharedShowAddress": "Show Address",
+ "sharedShowDetails": "More Details",
+ "sharedDisabled": "Disabled",
+ "sharedMaintenance": "Maintenance",
+ "sharedDeviceAccumulators": "Accumulators",
+ "sharedAlarms": "Alarms",
+ "sharedLocation": "Location",
+ "sharedImport": "Import",
+ "sharedColumns": "Columns",
+ "sharedDropzoneText": "Drag and drop a file here or click",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "Simple",
+ "calendarRecurrence": "Recurrence",
+ "calendarOnce": "Once",
+ "calendarDaily": "Daily",
+ "calendarWeekly": "Weekly",
+ "calendarMonthly": "Monthly",
+ "calendarDays": "Days",
+ "calendarSunday": "Sunday",
+ "calendarMonday": "Monday",
+ "calendarTuesday": "Tuesday",
+ "calendarWednesday": "Wednesday",
+ "calendarThursday": "Thursday",
+ "calendarFriday": "Friday",
+ "calendarSaturday": "Saturday",
+ "attributeShowGeofences": "Show Geofences",
+ "attributeSpeedLimit": "Giới hạn tốc độ",
+ "attributeFuelDropThreshold": "Fuel Drop Threshold",
+ "attributeFuelIncreaseThreshold": "Fuel Increase Threshold",
+ "attributePolylineDistance": "Polyline Distance",
+ "attributeReportIgnoreOdometer": "Báo cáo: Bỏ qua đồng hồ đo",
+ "attributeWebReportColor": "Web: Màu báo cáo",
+ "attributeDevicePassword": "Mật khẩu thiết bị",
+ "attributeDeviceImage": "Device Image",
+ "attributeDeviceInactivityStart": "Device Inactivity Start",
+ "attributeDeviceInactivityPeriod": "Device Inactivity Period",
+ "attributeProcessingCopyAttributes": "Thực thi: sao chép thuộc tính",
+ "attributeColor": "Màu",
+ "attributeWebLiveRouteLength": "Web: Độ dài tuyến",
+ "attributeWebSelectZoom": "Web: phóng to lựa chọn",
+ "attributeWebMaxZoom": "Web: Maximum Zoom",
+ "attributeTelegramChatId": "Telegram Chat ID",
+ "attributePushoverUserKey": "Pushover User Key",
+ "attributePushoverDeviceNames": "Pushover Device Names",
+ "attributeMailSmtpHost": "Email: SMTP Host",
+ "attributeMailSmtpPort": "Email: Cổng SMTP",
+ "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": "Mail: SMTP Username",
+ "attributeMailSmtpPassword": "Mail: SMTP Password",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "UI: Disable Attributes",
+ "attributeUiDisableGroups": "UI: Disable Groups",
+ "attributeUiDisableEvents": "UI: Disable Events",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "UI: Disable Drivers",
+ "attributeUiDisableComputedAttributes": "UI: Disable Computed Attributes",
+ "attributeUiDisableCalendars": "UI: Disable Calendars",
+ "attributeUiDisableMaintenance": "UI: Disable Maintenance",
+ "attributeUiHidePositionAttributes": "UI: Hide Position Attributes",
+ "attributeUiDisableLoginLanguage": "UI: Disable Login Language",
+ "attributeNotificationTokens": "Notification Tokens",
+ "attributePopupInfo": "Popup Info",
+ "errorTitle": "Lỗi",
+ "errorGeneral": "Tham số không hợp lệ hoặc hạn chế vi phạm",
+ "errorConnection": "Lỗi kết nối",
+ "errorSocket": "Lỗi kết nối trang",
+ "errorZero": "Can't be zero",
+ "userEmail": "Email",
+ "userPassword": "Mật khẩu",
+ "userAdmin": "Quản trị",
+ "userRemember": "Nhớ",
+ "userExpirationTime": "Hết hạn",
+ "userDeviceLimit": "Hạn chế thiết bị",
+ "userUserLimit": "Hạn chế người dùng",
+ "userDeviceReadonly": "Chỉ xem thiết bị",
+ "userLimitCommands": "Limit Commands",
+ "userDisableReports": "Disable Reports",
+ "userFixedEmail": "No Email Change",
+ "userToken": "Token",
+ "userDeleteAccount": "Delete Account",
+ "userTemporary": "Temporary",
+ "loginTitle": "Đăng nhập",
+ "loginLanguage": "Ngôn ngữ",
+ "loginReset": "Reset Password",
+ "loginRegister": "Đăng ký",
+ "loginLogin": "Đăng nhập",
+ "loginOpenId": "Login with OpenID",
+ "loginFailed": "Sai mật khẩu hoặc địa chỉ email",
+ "loginCreated": "Người dùng mới đã được đăng ký",
+ "loginResetSuccess": "Check your email",
+ "loginUpdateSuccess": "New password is set",
+ "loginLogout": "Đăng xuất",
+ "loginLogo": "Biểu tượng",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "Các thiết bị và trạng thái",
+ "deviceSelected": "Selected Device",
+ "deviceTitle": "Các thiết bị",
+ "devicePrimaryInfo": "Device Title",
+ "deviceSecondaryInfo": "Device Detail",
+ "deviceIdentifier": "Định danh",
+ "deviceModel": "Mẫu",
+ "deviceContact": "Liên hệ",
+ "deviceCategory": "Phân loại",
+ "deviceLastUpdate": "Cập nhật lần cuối",
+ "deviceCommand": "Lệnh",
+ "deviceFollow": "Theo dõi",
+ "deviceTotalDistance": "Tổng quãng đường",
+ "deviceStatus": "Trạng thái",
+ "deviceStatusOnline": "Trực tuyến",
+ "deviceStatusOffline": "Ngoại tuyến",
+ "deviceStatusUnknown": "Không xác định",
+ "deviceRegisterFirst": "Register your first device",
+ "deviceIdentifierHelp": "IMEI, serial number or other id. It has to match the identifier device reports to the server.",
+ "deviceShare": "Share Device",
+ "groupDialog": "Nhóm",
+ "groupParent": "Nhóm",
+ "groupNoGroup": "Không có nhóm",
+ "settingsTitle": "Cài đặt",
+ "settingsUser": "Tài khoản",
+ "settingsGroups": "Nhóm",
+ "settingsServer": "Máy chủ",
+ "settingsUsers": "Người dùng",
+ "settingsDistanceUnit": "Distance Unit",
+ "settingsAltitudeUnit": "Altitude Unit",
+ "settingsSpeedUnit": "Speed Unit",
+ "settingsVolumeUnit": "Volume Unit",
+ "settingsTwelveHourFormat": "Định dạng 12h",
+ "settingsCoordinateFormat": "Cấu chúc tọa độ",
+ "settingsServerVersion": "Server Version",
+ "settingsAppVersion": "App Version",
+ "settingsConnection": "Connection",
+ "settingsDarkMode": "Dark Mode",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "Báo cáo",
+ "reportScheduled": "Scheduled Reports",
+ "reportDevice": "Thiết bị",
+ "reportGroup": "Nhóm",
+ "reportFrom": "Từ",
+ "reportTo": "Đến",
+ "reportShow": "Hiển thị",
+ "reportClear": "Xóa",
+ "linkGoogleMaps": "Google Maps",
+ "linkAppleMaps": "Apple Maps",
+ "linkStreetView": "Street View",
+ "positionFixTime": "Fix Time",
+ "positionDeviceTime": "Device Time",
+ "positionServerTime": "Server Time",
+ "positionValid": "Có hiệu lực",
+ "positionAccuracy": "Chính xác",
+ "positionLatitude": "Vĩ độ",
+ "positionLongitude": "Kinh độ",
+ "positionAltitude": "Độ cao",
+ "positionSpeed": "Tốc độ",
+ "positionCourse": "Hướng",
+ "positionAddress": "Địa chỉ",
+ "positionProtocol": "Giao thức",
+ "positionDistance": "Khoảng cách",
+ "positionRpm": "RPM",
+ "positionFuel": "Nhiên liệu",
+ "positionPower": "Nguồn",
+ "positionBattery": "Pin",
+ "positionRaw": "Thô",
+ "positionIndex": "Danh mục",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "Satellites",
+ "positionSatVisible": "Visible Satellites",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "Roaming",
+ "positionEvent": "Sự kiện",
+ "positionAlarm": "Cảnh báo",
+ "positionStatus": "Trạng thái",
+ "positionOdometer": "Đồng hồ đo",
+ "positionServiceOdometer": "Đồng hồ đo",
+ "positionTripOdometer": "Quãng đường",
+ "positionHours": "Giờ",
+ "positionSteps": "Steps",
+ "positionInput": "Nhập",
+ "positionHeartRate": "Heart Rate",
+ "positionOutput": "Xuất",
+ "positionBatteryLevel": "Mức pin",
+ "positionFuelConsumption": "Tiêu thụ nhiên liệu",
+ "positionRfid": "RFID",
+ "positionVersionFw": "Phiên bản",
+ "positionVersionHw": "Phiên bản phần cứng",
+ "positionIgnition": "Máy",
+ "positionFlags": "Cờ",
+ "positionCharge": "Nạp tiền",
+ "positionIp": "IP",
+ "positionArchive": "Lưu trữ",
+ "positionVin": "VIN",
+ "positionApproximate": "Độ chính xác",
+ "positionThrottle": "Cổ hút",
+ "positionMotion": "Chuyển động",
+ "positionArmed": "Bật báo động",
+ "positionAcceleration": "Tăng tốc",
+ "positionTemp": "Temperature",
+ "positionDeviceTemp": "Nhiệt độ thiết bị",
+ "positionCoolantTemp": "Coolant Temperature",
+ "positionOperator": "Operator",
+ "positionCommand": "Command",
+ "positionBlocked": "Chặn",
+ "positionDtcs": "DTCs",
+ "positionObdSpeed": "Tốc độ OBD",
+ "positionObdOdometer": "Quãng đường ODB",
+ "positionDrivingTime": "Driving Time",
+ "positionDriverUniqueId": "Driver Unique Id",
+ "positionCard": "Card",
+ "positionImage": "Image",
+ "positionVideo": "Video",
+ "positionAudio": "Audio",
+ "serverTitle": "Cài đặt máy chủ",
+ "serverZoom": "Phóng to",
+ "serverRegistration": "Đăng ký",
+ "serverReadonly": "Chỉ đọc",
+ "serverForceSettings": "Buộc thiết lập",
+ "serverAnnouncement": "Announcement",
+ "serverName": "Server Name",
+ "serverDescription": "Server Description",
+ "serverColorPrimary": "Color Primary",
+ "serverColorSecondary": "Color Secondary",
+ "serverLogo": "Logo Image",
+ "serverLogoInverted": "Inverted Logo Image",
+ "serverChangeDisable": "Disable Server Change",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "Bản đồ",
+ "mapActive": "Active Maps",
+ "mapOverlay": "Map Overlay",
+ "mapOverlayCustom": "Custom Overlay",
+ "mapOpenSeaMap": "OpenSeaMap",
+ "mapOpenRailwayMap": "OpenRailwayMap",
+ "mapOpenWeatherKey": "OpenWeather API Key",
+ "mapOpenWeatherClouds": "OpenWeather Clouds",
+ "mapOpenWeatherPrecipitation": "OpenWeather Precipitation",
+ "mapOpenWeatherPressure": "OpenWeather Pressure",
+ "mapOpenWeatherWind": "OpenWeather Wind",
+ "mapOpenWeatherTemperature": "OpenWeather Temperature",
+ "mapLayer": "Lớp bản đồ",
+ "mapCustom": "Custom (XYZ)",
+ "mapCustomArcgis": "Custom (ArcGIS)",
+ "mapCustomLabel": "Custom map",
+ "mapCarto": "Carto Basemaps",
+ "mapOsm": "OpenStreetMap",
+ "mapGoogleRoad": "Google Road",
+ "mapGoogleHybrid": "Google Hybrid",
+ "mapGoogleSatellite": "Google Satellite",
+ "mapOpenTopoMap": "OpenTopoMap",
+ "mapBingKey": "Bing Maps Key",
+ "mapBingRoad": "Bing Maps Road",
+ "mapBingAerial": "Bing Maps Aerial",
+ "mapBingHybrid": "Bản đồ Bing Hybird",
+ "mapBaidu": "Bản đồ Baidu",
+ "mapAutoNavi": "AutoNavi",
+ "mapYandexMap": "Bản đồ Yandex",
+ "mapYandexSat": "Bản đồ Yandex Vệ tinh ",
+ "mapWikimedia": "Wikimedia",
+ "mapOrdnanceSurvey": "Ordnance Survey",
+ "mapMapboxStreets": "Mapbox Streets",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox Outdoors",
+ "mapMapboxSatellite": "Mapbox Satellite",
+ "mapMapboxKey": "Mapbox Access Token",
+ "mapMapTilerBasic": "MapTiler Basic",
+ "mapMapTilerHybrid": "MapTiler Hybrid",
+ "mapMapTilerKey": "MapTiler API Key",
+ "mapLocationIqStreets": "LocationIQ Streets",
+ "mapLocationIqDark": "LocationIQ Dark",
+ "mapLocationIqKey": "LocationIQ Access Token",
+ "mapTomTomBasic": "TomTom Basic",
+ "mapTomTomFlow": "TomTom Traffic Flow",
+ "mapTomTomIncidents": "TomTom Traffic Incidents",
+ "mapTomTomKey": "TomTom API Key",
+ "mapHereBasic": "Here Basic",
+ "mapHereHybrid": "Here Hybrid",
+ "mapHereSatellite": "Here Satellite",
+ "mapHereFlow": "Here Traffic Flow",
+ "mapHereKey": "Here API Key",
+ "mapShapePolygon": "Đa giác",
+ "mapShapeCircle": "Vòng tròn",
+ "mapShapePolyline": "Đường kẻ đa giác",
+ "mapLiveRoutes": "Lộ trình trực tuyến",
+ "mapDirection": "Show Direction",
+ "mapCurrentLocation": "Current Location",
+ "mapPoiLayer": "POI Layer",
+ "mapClustering": "Markers Clustering",
+ "mapOnSelect": "Show Map on Selection",
+ "mapDefault": "Default Map",
+ "stateTitle": "Trạng thái",
+ "stateName": "Thuộc tính",
+ "stateValue": "Giá trị",
+ "commandTitle": "Lệnh",
+ "commandSend": "Gửi",
+ "commandSent": "Command sent",
+ "commandQueued": "Command queued",
+ "commandUnit": "Đơn vị",
+ "commandCustom": "Lệnh tùy chỉnh",
+ "commandDeviceIdentification": "Định danh thiết bị",
+ "commandPositionSingle": "Báo cáo đơn",
+ "commandPositionPeriodic": "Báo cáo định kỳ",
+ "commandPositionStop": "Dừng báo cáo",
+ "commandEngineStop": "Tắt máy",
+ "commandEngineResume": "Bật máy",
+ "commandAlarmArm": "Báo động cho phép",
+ "commandAlarmDisarm": "Báo động không cho phép",
+ "commandAlarmDismiss": "Dismiss Alarm",
+ "commandSetTimezone": "Thiết lập múi giờ",
+ "commandRequestPhoto": "Yêu cầu ảnh",
+ "commandPowerOff": "Power Off Device",
+ "commandRebootDevice": "Khởi động lại thiết bị",
+ "commandFactoryReset": "Factory Reset",
+ "commandSendSms": "Gửi tin nhắn",
+ "commandSendUssd": "Gửi mã USSD",
+ "commandSosNumber": "Thiết lập số khẩn cấp",
+ "commandSilenceTime": "Thiêt lập giờ im lặng",
+ "commandSetPhonebook": "Thiết lập danh bạ điện thoại",
+ "commandVoiceMessage": "Tin nhắn thoại",
+ "commandOutputControl": "Điều khiển đầu ra",
+ "commandVoiceMonitoring": "Voice Monitoring",
+ "commandSetAgps": "Set AGPS",
+ "commandSetIndicator": "Thiết lập hiển thị",
+ "commandConfiguration": "Configuration",
+ "commandGetVersion": "Get Version",
+ "commandFirmwareUpdate": "Update Firmware",
+ "commandSetConnection": "Set Connection",
+ "commandSetOdometer": "Set Odometer",
+ "commandGetModemStatus": "Get Modem Status",
+ "commandGetDeviceStatus": "Get Device Status",
+ "commandSetSpeedLimit": "Set Speed Limit",
+ "commandModePowerSaving": "Power Saving Mode",
+ "commandModeDeepSleep": "Deep Sleep Mode",
+ "commandAlarmGeofence": "Set Geofence Alarm",
+ "commandAlarmBattery": "Set Battery Alarm",
+ "commandAlarmSos": "Set SOS Alarm",
+ "commandAlarmRemove": "Set Remove Alarm",
+ "commandAlarmClock": "Set Clock Alarm",
+ "commandAlarmSpeed": "Set Speed Alarm",
+ "commandAlarmFall": "Set Fall Alarm",
+ "commandAlarmVibration": "Set Vibration Alarm",
+ "commandFrequency": "Tần suất",
+ "commandTimezone": "Múi giờ",
+ "commandMessage": "Thông báo",
+ "commandRadius": "Radius",
+ "commandEnable": "Enable",
+ "commandData": "Dữ liệu",
+ "commandIndex": "Danh mục",
+ "commandPhone": "Số điện thoại",
+ "commandServer": "Server",
+ "commandPort": "Port",
+ "eventAll": "Tất cả sự kiện",
+ "eventDeviceOnline": "Status online",
+ "eventDeviceUnknown": "Status unknown",
+ "eventDeviceOffline": "Status offline",
+ "eventDeviceInactive": "Device inactive",
+ "eventQueuedCommandSent": "Queued command sent",
+ "eventDeviceMoving": "Device moving",
+ "eventDeviceStopped": "Device stopped",
+ "eventDeviceOverspeed": "Speed limit exceeded",
+ "eventDeviceFuelDrop": "Fuel drop",
+ "eventDeviceFuelIncrease": "Fuel increase",
+ "eventCommandResult": "Kết quả lệnh",
+ "eventGeofenceEnter": "Geofence entered",
+ "eventGeofenceExit": "Geofence exited",
+ "eventAlarm": "Alarm",
+ "eventIgnitionOn": "Ignition on",
+ "eventIgnitionOff": "Ignition off",
+ "eventMaintenance": "Yêu cầu bảo dưỡng",
+ "eventTextMessage": "Đã nhận tin nhắn",
+ "eventDriverChanged": "Driver changed",
+ "eventMedia": "Media",
+ "eventsScrollToLast": "Kéo xuống cuối",
+ "eventsSoundEvents": "Sound Events",
+ "eventsSoundAlarms": "Sound Alarms",
+ "alarmGeneral": "General",
+ "alarmSos": "SOS",
+ "alarmVibration": "Vibration",
+ "alarmMovement": "Movement",
+ "alarmLowspeed": "Low Speed",
+ "alarmOverspeed": "Overspeed",
+ "alarmFallDown": "Fall Down",
+ "alarmLowPower": "Low Power",
+ "alarmLowBattery": "Low Battery",
+ "alarmFault": "Fault",
+ "alarmPowerOff": "Power Off",
+ "alarmPowerOn": "Power On",
+ "alarmDoor": "Door",
+ "alarmLock": "Lock",
+ "alarmUnlock": "Unlock",
+ "alarmGeofence": "Geofence",
+ "alarmGeofenceEnter": "Geofence Enter",
+ "alarmGeofenceExit": "Geofence Exit",
+ "alarmGpsAntennaCut": "GPS Antenna Cut",
+ "alarmAccident": "Accident",
+ "alarmTow": "Tow",
+ "alarmIdle": "Idle",
+ "alarmHighRpm": "High RPM",
+ "alarmHardAcceleration": "Hard Acceleration",
+ "alarmHardBraking": "Hard Braking",
+ "alarmHardCornering": "Hard Cornering",
+ "alarmLaneChange": "Lane Change",
+ "alarmFatigueDriving": "Fatigue Driving",
+ "alarmPowerCut": "Power Cut",
+ "alarmPowerRestored": "Power Restored",
+ "alarmJamming": "Jamming",
+ "alarmTemperature": "Temperature",
+ "alarmParking": "Parking",
+ "alarmBonnet": "Bonnet",
+ "alarmFootBrake": "Foot Brake",
+ "alarmFuelLeak": "Fuel Leak",
+ "alarmTampering": "Tampering",
+ "alarmRemoving": "Removing",
+ "notificationType": "Loại thông báo",
+ "notificationAlways": "All Devices",
+ "notificationNotificators": "Channels",
+ "notificatorCommand": "Command",
+ "notificatorWeb": "Web",
+ "notificatorMail": "Mail",
+ "notificatorSms": "SMS",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "Replay",
+ "reportCombined": "Combined",
+ "reportRoute": "Lộ trình",
+ "reportEvents": "Sự kiện",
+ "reportTrips": "Hành trình",
+ "reportStops": "Dừng đỗ",
+ "reportSummary": "Sơ lược",
+ "reportDaily": "Daily Summary",
+ "reportChart": "Biểu đồ",
+ "reportConfigure": "Cấu hình",
+ "reportEventTypes": "Loại sự kiện",
+ "reportChartType": "Kiểu biều đồ",
+ "reportShowMarkers": "Hiển thị dấu",
+ "reportExport": "Xuất",
+ "reportEmail": "Email Report",
+ "reportSchedule": "Schedule",
+ "reportPeriod": "Period",
+ "reportCustom": "Custom",
+ "reportToday": "Today",
+ "reportYesterday": "Yesterday",
+ "reportThisWeek": "This Week",
+ "reportPreviousWeek": "Previous Week",
+ "reportThisMonth": "This Month",
+ "reportPreviousMonth": "Previous Month",
+ "reportDeviceName": "Tên thiết bị",
+ "reportAverageSpeed": "Tốc độ trung bình",
+ "reportMaximumSpeed": "Tốc độ cao nhất",
+ "reportEngineHours": "Thời gian nổ máy",
+ "reportDuration": "Khoảng thời gian",
+ "reportStartDate": "Start Date",
+ "reportStartTime": "Thời gian bắt đầu",
+ "reportStartAddress": "Địa chỉ bắt đầu",
+ "reportEndTime": "Thời gian kết thúc",
+ "reportEndAddress": "Địa chỉ kết thúc",
+ "reportSpentFuel": "Tiêu thụ nguyên liệu",
+ "reportStartOdometer": "Odometer Start",
+ "reportEndOdometer": "Odometer End",
+ "statisticsTitle": "Thống kê",
+ "statisticsCaptureTime": "Thời gian",
+ "statisticsActiveUsers": "Người dùng được kích hoạt",
+ "statisticsActiveDevices": "Thiết bị được kích hoạt",
+ "statisticsRequests": "Yêu cầu",
+ "statisticsMessagesReceived": "Thông báo đã nhận",
+ "statisticsMessagesStored": "Thông báo đã nhận",
+ "statisticsGeocoder": "Yêu cầu địa chỉ",
+ "statisticsGeolocation": "Yêu cầu địa chỉ",
+ "categoryArrow": "Mũi tên",
+ "categoryDefault": "Mặc định",
+ "categoryAnimal": "Vật nuôi",
+ "categoryBicycle": "Xe đạp",
+ "categoryBoat": "Tầu thuyền",
+ "categoryBus": "Xe buýt",
+ "categoryCar": "Xe con",
+ "categoryCamper": "Camper",
+ "categoryCrane": "Cần cẩu",
+ "categoryHelicopter": "Trực thăng",
+ "categoryMotorcycle": "Xe máy",
+ "categoryOffroad": "Offroad",
+ "categoryPerson": "Cá nhân",
+ "categoryPickup": "Pickup",
+ "categoryPlane": "Máy bay",
+ "categoryShip": "Tàu thủy",
+ "categoryTractor": "Máy kéo",
+ "categoryTrain": "Train",
+ "categoryTram": "Tram",
+ "categoryTrolleybus": "Trolleybus",
+ "categoryTruck": "Xe tải",
+ "categoryVan": "Xe thùng",
+ "categoryScooter": "Scooter",
+ "maintenanceStart": "Start",
+ "maintenancePeriod": "Period"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/zh.json b/legacy/web/l10n/zh.json
new file mode 100644
index 00000000..65d9e723
--- /dev/null
+++ b/legacy/web/l10n/zh.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "加载",
+ "sharedHide": "隐藏",
+ "sharedSave": "保存",
+ "sharedUpload": "上传",
+ "sharedSet": "设置",
+ "sharedCancel": "取消",
+ "sharedCopy": "复制",
+ "sharedAdd": "添加",
+ "sharedEdit": "编辑",
+ "sharedRemove": "删除",
+ "sharedRemoveConfirm": "删除选中项?",
+ "sharedNoData": "没有数据",
+ "sharedSubject": "主题",
+ "sharedYes": "是",
+ "sharedNo": "否",
+ "sharedKm": "千米",
+ "sharedMi": "英里",
+ "sharedNmi": "海里",
+ "sharedMeters": "米",
+ "sharedFeet": "英尺",
+ "sharedKn": "节",
+ "sharedKmh": "千米/小时",
+ "sharedMph": "英里/小时",
+ "sharedHour": "小时",
+ "sharedMinute": "分钟",
+ "sharedSecond": "秒",
+ "sharedDays": "天",
+ "sharedHours": "小时",
+ "sharedMinutes": "分钟",
+ "sharedDecimalDegrees": "度",
+ "sharedDegreesDecimalMinutes": "度分",
+ "sharedDegreesMinutesSeconds": "度分秒",
+ "sharedName": "名称",
+ "sharedDescription": "描述",
+ "sharedSearch": "搜索",
+ "sharedIconScale": "图标比例",
+ "sharedGeofence": "围栏",
+ "sharedGeofences": "围栏",
+ "sharedCreateGeofence": "创建围栏",
+ "sharedNotifications": "通知",
+ "sharedNotification": "通知",
+ "sharedAttributes": "属性",
+ "sharedAttribute": "属性",
+ "sharedDrivers": "驾驶员",
+ "sharedDriver": "驾驶员",
+ "sharedArea": "区域",
+ "sharedSound": "通知铃声",
+ "sharedType": "类型",
+ "sharedDistance": "里程",
+ "sharedHourAbbreviation": "小时",
+ "sharedMinuteAbbreviation": "分",
+ "sharedSecondAbbreviation": "秒",
+ "sharedVoltAbbreviation": "伏",
+ "sharedLiterAbbreviation": "升",
+ "sharedGallonAbbreviation": "加仑",
+ "sharedLiter": "升",
+ "sharedImpGallon": "英制加仑",
+ "sharedUsGallon": "美制加仑",
+ "sharedLiterPerHourAbbreviation": "升/小时",
+ "sharedGetMapState": "获取地图状态",
+ "sharedComputedAttribute": "计算属性",
+ "sharedComputedAttributes": "计算属性",
+ "sharedCheckComputedAttribute": "确认计算属性",
+ "sharedExpression": "表达式",
+ "sharedDevice": "设备",
+ "sharedTest": "测试",
+ "sharedTestNotification": "发送测试通知",
+ "sharedTestNotificators": "测试通道",
+ "sharedTestExpression": "测试表达式",
+ "sharedCalendar": "日历",
+ "sharedCalendars": "日历",
+ "sharedFile": "文件",
+ "sharedSearchDevices": "搜索设备",
+ "sharedSortBy": "排序方式",
+ "sharedFilterMap": "在地图上过滤",
+ "sharedSelectFile": "选择文件",
+ "sharedPhone": "电话",
+ "sharedRequired": "必填",
+ "sharedPreferences": "首选项",
+ "sharedPermissions": "权限",
+ "sharedConnections": "关联",
+ "sharedExtra": "附加",
+ "sharedPrimary": "设备信息首行",
+ "sharedSecondary": "设备信息次行",
+ "sharedTypeString": "字符串",
+ "sharedTypeNumber": "数字",
+ "sharedTypeBoolean": "布尔",
+ "sharedTimezone": "时区",
+ "sharedInfoTitle": "信息",
+ "sharedSavedCommand": "保存指令",
+ "sharedSavedCommands": "指令表",
+ "sharedNew": "新建",
+ "sharedShowAddress": "显示地址",
+ "sharedShowDetails": "详情请见",
+ "sharedDisabled": "禁用",
+ "sharedMaintenance": "维护",
+ "sharedDeviceAccumulators": "蓄电池",
+ "sharedAlarms": "警报",
+ "sharedLocation": "位置",
+ "sharedImport": "导入",
+ "sharedColumns": "显示列",
+ "sharedDropzoneText": "将文件拖放到此处或者单击",
+ "sharedLogs": "日志",
+ "sharedLink": "关联",
+ "calendarSimple": "简单",
+ "calendarRecurrence": "复现",
+ "calendarOnce": "单次",
+ "calendarDaily": "每日",
+ "calendarWeekly": "每周",
+ "calendarMonthly": "每月",
+ "calendarDays": "天",
+ "calendarSunday": "周日",
+ "calendarMonday": "周一",
+ "calendarTuesday": "周二",
+ "calendarWednesday": "周三",
+ "calendarThursday": "周四",
+ "calendarFriday": "周五",
+ "calendarSaturday": "周六",
+ "attributeShowGeofences": "显示围栏",
+ "attributeSpeedLimit": "速度限制",
+ "attributeFuelDropThreshold": "燃油下降阈值",
+ "attributeFuelIncreaseThreshold": "燃油增加阈值",
+ "attributePolylineDistance": "折线里程",
+ "attributeReportIgnoreOdometer": "报告:忽略里程表",
+ "attributeWebReportColor": "网页:报告颜色",
+ "attributeDevicePassword": "设备密码",
+ "attributeDeviceImage": "设备图片",
+ "attributeDeviceInactivityStart": "设备无响应起始",
+ "attributeDeviceInactivityPeriod": "设备无响应时段",
+ "attributeProcessingCopyAttributes": "处理中:复制属性",
+ "attributeColor": "颜色",
+ "attributeWebLiveRouteLength": "网页:活动路径长度",
+ "attributeWebSelectZoom": "网页:缩放选择项",
+ "attributeWebMaxZoom": "网页:最大的缩放",
+ "attributeTelegramChatId": "Telegram 账号",
+ "attributePushoverUserKey": "Pushover 用户密钥",
+ "attributePushoverDeviceNames": "Pushover 设备名称",
+ "attributeMailSmtpHost": "邮件:SMTP 主机",
+ "attributeMailSmtpPort": "邮件:SMTP 端口",
+ "attributeMailSmtpStarttlsEnable": "邮件:SMTP STARTTLS 开启",
+ "attributeMailSmtpStarttlsRequired": "邮件:SMTP STARTTLS 必填",
+ "attributeMailSmtpSslEnable": "邮件:SMTP SSL 开启",
+ "attributeMailSmtpSslTrust": "邮件:SMTP SSL 信任",
+ "attributeMailSmtpSslProtocols": "邮件:SMTP SSL 协议",
+ "attributeMailSmtpFrom": "邮件:SMTP 来源",
+ "attributeMailSmtpAuth": "邮件:SMTP 认证开启",
+ "attributeMailSmtpUsername": "邮件:SMTP 用户名",
+ "attributeMailSmtpPassword": "邮件:SMTP 密码",
+ "attributeUiDisableSavedCommands": "用户界面:禁用已保存的命令",
+ "attributeUiDisableAttributes": "用户界面:禁用属性",
+ "attributeUiDisableGroups": "用户界面:禁用分组",
+ "attributeUiDisableEvents": "用户界面:禁用事件",
+ "attributeUiDisableVehicleFeatures": "用户界面:禁用车辆功能",
+ "attributeUiDisableDrivers": "用户界面:禁用驾驶员",
+ "attributeUiDisableComputedAttributes": "用户界面:禁用计算属性",
+ "attributeUiDisableCalendars": "用户界面:禁用日历",
+ "attributeUiDisableMaintenance": "用户界面:禁用维护",
+ "attributeUiHidePositionAttributes": "用户界面:隐藏位置属性",
+ "attributeUiDisableLoginLanguage": "用户界面:禁用登录语言",
+ "attributeNotificationTokens": "通知令牌",
+ "attributePopupInfo": "卡片信息",
+ "errorTitle": "错误",
+ "errorGeneral": "无效参数",
+ "errorConnection": "连接错误",
+ "errorSocket": "网络通讯错误",
+ "errorZero": "不能为零",
+ "userEmail": "邮箱",
+ "userPassword": "密码",
+ "userAdmin": "管理员",
+ "userRemember": "记住密码",
+ "userExpirationTime": "失效日期",
+ "userDeviceLimit": "设备限制",
+ "userUserLimit": "用户限制",
+ "userDeviceReadonly": "设备只读",
+ "userLimitCommands": "禁用指令",
+ "userDisableReports": "禁用报表",
+ "userFixedEmail": "禁止更改邮箱",
+ "userToken": "令牌",
+ "userDeleteAccount": "删除账户",
+ "userTemporary": "暂时",
+ "loginTitle": "登录",
+ "loginLanguage": "语言",
+ "loginReset": "密码重设",
+ "loginRegister": "注册",
+ "loginLogin": "登录",
+ "loginOpenId": "以开放 ID 登录",
+ "loginFailed": "邮箱或密码错误",
+ "loginCreated": "新用户已注册成功",
+ "loginResetSuccess": "查看您的电子邮件",
+ "loginUpdateSuccess": "密码已重置",
+ "loginLogout": "注销",
+ "loginLogo": "图标",
+ "loginTotpCode": "一次性密码",
+ "loginTotpKey": "一次性密码密钥",
+ "devicesAndState": "设备和状态",
+ "deviceSelected": "已选设备",
+ "deviceTitle": "设备",
+ "devicePrimaryInfo": "设备名称",
+ "deviceSecondaryInfo": "设备详情",
+ "deviceIdentifier": "标识符",
+ "deviceModel": "型号",
+ "deviceContact": "联系人",
+ "deviceCategory": "类别",
+ "deviceLastUpdate": "最后更新时间",
+ "deviceCommand": "指令",
+ "deviceFollow": "跟随设备",
+ "deviceTotalDistance": "总里程",
+ "deviceStatus": "状态",
+ "deviceStatusOnline": "在线",
+ "deviceStatusOffline": "离线",
+ "deviceStatusUnknown": "未知",
+ "deviceRegisterFirst": "注册您的第一台设备",
+ "deviceIdentifierHelp": "IMEI、序列号或其他 ID。它必须匹配报告给服务器的设备标识符。",
+ "deviceShare": "共享设备",
+ "groupDialog": "分组",
+ "groupParent": "分组",
+ "groupNoGroup": "未分组",
+ "settingsTitle": "设置",
+ "settingsUser": "账户",
+ "settingsGroups": "分组",
+ "settingsServer": "服务器",
+ "settingsUsers": "用户",
+ "settingsDistanceUnit": "里程单位",
+ "settingsAltitudeUnit": "海拔单位",
+ "settingsSpeedUnit": "速度单位",
+ "settingsVolumeUnit": "体积单位",
+ "settingsTwelveHourFormat": "12 小时制",
+ "settingsCoordinateFormat": "坐标格式",
+ "settingsServerVersion": "服务器版本",
+ "settingsAppVersion": "应用版本",
+ "settingsConnection": "连接",
+ "settingsDarkMode": "深色模式",
+ "settingsTotpEnable": "启用一次性密码",
+ "settingsTotpForce": "强制使用一次性密码",
+ "settingsServiceWorkerUpdateInterval": "服务线程更新间隔",
+ "settingsUpdateAvailable": "有可用更新。",
+ "settingsSupport": "支持",
+ "reportTitle": "报表",
+ "reportScheduled": "预定报告",
+ "reportDevice": "设备",
+ "reportGroup": "分组",
+ "reportFrom": "起始",
+ "reportTo": "结束",
+ "reportShow": "查询",
+ "reportClear": "清空",
+ "linkGoogleMaps": "谷歌地图",
+ "linkAppleMaps": "苹果地图",
+ "linkStreetView": "街景",
+ "positionFixTime": "修正时间",
+ "positionDeviceTime": "设备时间",
+ "positionServerTime": "服务器时间",
+ "positionValid": "有效",
+ "positionAccuracy": "精度",
+ "positionLatitude": "纬度",
+ "positionLongitude": "经度",
+ "positionAltitude": "海拔",
+ "positionSpeed": "速度",
+ "positionCourse": "行驶方向",
+ "positionAddress": "地址",
+ "positionProtocol": "协议",
+ "positionDistance": "里程",
+ "positionRpm": "转速",
+ "positionFuel": "燃油",
+ "positionPower": "电源",
+ "positionBattery": "电池",
+ "positionRaw": "原生数据",
+ "positionIndex": "索引",
+ "positionHdop": "水平精度",
+ "positionVdop": "垂直精度",
+ "positionPdop": "位置精度",
+ "positionSat": "卫星",
+ "positionSatVisible": "可见卫星",
+ "positionRssi": "接收信号强度",
+ "positionGps": "全球定位系统",
+ "positionRoaming": "漫游",
+ "positionEvent": "事件",
+ "positionAlarm": "警报",
+ "positionStatus": "状态",
+ "positionOdometer": "里程表",
+ "positionServiceOdometer": "服务里程表",
+ "positionTripOdometer": "行程里程表",
+ "positionHours": "小时",
+ "positionSteps": "步骤",
+ "positionInput": "输入",
+ "positionHeartRate": "心率",
+ "positionOutput": "输出",
+ "positionBatteryLevel": "电池电量",
+ "positionFuelConsumption": "油耗",
+ "positionRfid": "射频识别",
+ "positionVersionFw": "固件版本",
+ "positionVersionHw": "硬件版本",
+ "positionIgnition": "点火",
+ "positionFlags": "标记",
+ "positionCharge": "充电",
+ "positionIp": "IP 地址",
+ "positionArchive": "档案",
+ "positionVin": "车辆识别码",
+ "positionApproximate": "近似值",
+ "positionThrottle": "油门",
+ "positionMotion": "移动",
+ "positionArmed": "Armed",
+ "positionAcceleration": "加速度",
+ "positionTemp": "温度",
+ "positionDeviceTemp": "设备温度",
+ "positionCoolantTemp": "冷却液温度",
+ "positionOperator": "操作员",
+ "positionCommand": "指令",
+ "positionBlocked": "屏蔽",
+ "positionDtcs": "双离合变速箱",
+ "positionObdSpeed": "OBD 速度",
+ "positionObdOdometer": "OBD 里程表",
+ "positionDrivingTime": "行驶时间",
+ "positionDriverUniqueId": "驾驶员独有 ID",
+ "positionCard": "卡片",
+ "positionImage": "图片",
+ "positionVideo": "视频",
+ "positionAudio": "音频",
+ "serverTitle": "服务器设置",
+ "serverZoom": "缩放",
+ "serverRegistration": "注册",
+ "serverReadonly": "只读",
+ "serverForceSettings": "强制设置",
+ "serverAnnouncement": "公告",
+ "serverName": "服务器名称",
+ "serverDescription": "服务器描述",
+ "serverColorPrimary": "首选颜色",
+ "serverColorSecondary": "次选颜色",
+ "serverLogo": "标识图片",
+ "serverLogoInverted": "倒置标识图片",
+ "serverChangeDisable": "禁用服务器更改",
+ "serverDisableShare": "禁用设备共享",
+ "mapTitle": "地图",
+ "mapActive": "已选地图",
+ "mapOverlay": "地图叠层",
+ "mapOverlayCustom": "自定义叠层",
+ "mapOpenSeaMap": "开放海洋地图",
+ "mapOpenRailwayMap": "开放铁路地图",
+ "mapOpenWeatherKey": "开放气候API密钥",
+ "mapOpenWeatherClouds": "开放气候云层图",
+ "mapOpenWeatherPrecipitation": "开放气候降水图",
+ "mapOpenWeatherPressure": "开放气候气压图",
+ "mapOpenWeatherWind": "开放气候风力图",
+ "mapOpenWeatherTemperature": "开放气候气温图",
+ "mapLayer": "地图图层",
+ "mapCustom": "自定义 (XYZ)",
+ "mapCustomArcgis": "自定义 (ArcGIS)",
+ "mapCustomLabel": "自定义地图",
+ "mapCarto": "Carto 基础地图",
+ "mapOsm": "开放街景地图",
+ "mapGoogleRoad": "谷歌道路地图",
+ "mapGoogleHybrid": "谷歌混合地图",
+ "mapGoogleSatellite": "谷歌卫星地图",
+ "mapOpenTopoMap": "OpenTopo 地图",
+ "mapBingKey": "必应地图密钥",
+ "mapBingRoad": "必应公路地图",
+ "mapBingAerial": "必应航测地图",
+ "mapBingHybrid": "必应混合地图",
+ "mapBaidu": "百度地图",
+ "mapAutoNavi": " 高德地图",
+ "mapYandexMap": "Yandex 地图",
+ "mapYandexSat": "Yandex 卫星地图",
+ "mapWikimedia": "维基媒体",
+ "mapOrdnanceSurvey": " 全国地形测量",
+ "mapMapboxStreets": "Mapbox 街道",
+ "mapMapboxStreetsDark": "Mapbox 深色街图",
+ "mapMapboxOutdoors": "Mapbox 外景",
+ "mapMapboxSatellite": "Mapbox 卫星地图",
+ "mapMapboxKey": "Mapbox 访问令牌",
+ "mapMapTilerBasic": "MapTiler 基础地图",
+ "mapMapTilerHybrid": "MapTiler 混合地图",
+ "mapMapTilerKey": "MapTiler API 密钥",
+ "mapLocationIqStreets": "LocationIQ 街道地图",
+ "mapLocationIqDark": "LocationIQ 深色地图",
+ "mapLocationIqKey": "LocationIQ 访问令牌",
+ "mapTomTomBasic": "TomTom 基础地图",
+ "mapTomTomFlow": "TomTom 交通路况",
+ "mapTomTomIncidents": "TomTom 交通事故",
+ "mapTomTomKey": "TomTom API 密钥",
+ "mapHereBasic": "Here 基础地图",
+ "mapHereHybrid": "Here 混合地图",
+ "mapHereSatellite": "Here 卫星地图",
+ "mapHereFlow": "Here 交通路况",
+ "mapHereKey": "Here API 密钥",
+ "mapShapePolygon": "多边形",
+ "mapShapeCircle": "圆形",
+ "mapShapePolyline": "多段线",
+ "mapLiveRoutes": "移动轨迹",
+ "mapDirection": "显示方向",
+ "mapCurrentLocation": "当前位置",
+ "mapPoiLayer": "兴趣点图层",
+ "mapClustering": "合并车辆标记",
+ "mapOnSelect": "显示地图选项",
+ "mapDefault": "默认地图",
+ "stateTitle": "状态",
+ "stateName": "参数",
+ "stateValue": "值",
+ "commandTitle": "指令",
+ "commandSend": "发送",
+ "commandSent": "指令已发送",
+ "commandQueued": "指令已排队",
+ "commandUnit": "单位",
+ "commandCustom": "自定义指令",
+ "commandDeviceIdentification": "设备标识",
+ "commandPositionSingle": "单个报告",
+ "commandPositionPeriodic": "定期报告",
+ "commandPositionStop": "停止报告",
+ "commandEngineStop": "引擎熄火",
+ "commandEngineResume": "引擎重启",
+ "commandAlarmArm": "部署警报",
+ "commandAlarmDisarm": "解除警报",
+ "commandAlarmDismiss": "消除警报",
+ "commandSetTimezone": "设置时区",
+ "commandRequestPhoto": "请求图片",
+ "commandPowerOff": "关闭设备",
+ "commandRebootDevice": "重启设备",
+ "commandFactoryReset": "恢复出厂设置",
+ "commandSendSms": "发送短信",
+ "commandSendUssd": "发送 USSD",
+ "commandSosNumber": "设置 SOS 号码",
+ "commandSilenceTime": "设置静音时间",
+ "commandSetPhonebook": "设置通讯录",
+ "commandVoiceMessage": "语音信息",
+ "commandOutputControl": "输出控制",
+ "commandVoiceMonitoring": "语音监控",
+ "commandSetAgps": "设置 AGPS",
+ "commandSetIndicator": "设置指示器",
+ "commandConfiguration": "配置",
+ "commandGetVersion": "获取版本",
+ "commandFirmwareUpdate": "更新固件",
+ "commandSetConnection": "设置连接",
+ "commandSetOdometer": "设置里程表",
+ "commandGetModemStatus": "获取调制解调器状态",
+ "commandGetDeviceStatus": "获取设备状态",
+ "commandSetSpeedLimit": "设置速度限制",
+ "commandModePowerSaving": "节能模式",
+ "commandModeDeepSleep": "睡眠模式",
+ "commandAlarmGeofence": "设置围栏警报",
+ "commandAlarmBattery": "设置电池警报",
+ "commandAlarmSos": "设置 SOS 警报",
+ "commandAlarmRemove": "设置删除警报",
+ "commandAlarmClock": "设置时钟警报",
+ "commandAlarmSpeed": "设置速度警报",
+ "commandAlarmFall": "设置跌落警报",
+ "commandAlarmVibration": "设置振动警报",
+ "commandFrequency": "频率",
+ "commandTimezone": "时区偏移",
+ "commandMessage": "消息",
+ "commandRadius": "半径",
+ "commandEnable": "开启",
+ "commandData": "日期",
+ "commandIndex": "索引",
+ "commandPhone": "电话号码",
+ "commandServer": "服务器",
+ "commandPort": "端口",
+ "eventAll": "所有事件",
+ "eventDeviceOnline": "在线状态",
+ "eventDeviceUnknown": "未知状态",
+ "eventDeviceOffline": "离线状态",
+ "eventDeviceInactive": "设备无响应",
+ "eventQueuedCommandSent": "已发送命令队列",
+ "eventDeviceMoving": "设备移动中",
+ "eventDeviceStopped": "设备已停止",
+ "eventDeviceOverspeed": "超速限制",
+ "eventDeviceFuelDrop": "燃油下降",
+ "eventDeviceFuelIncrease": "燃油增加",
+ "eventCommandResult": "指令结果",
+ "eventGeofenceEnter": "进入围栏",
+ "eventGeofenceExit": "离开围栏",
+ "eventAlarm": "警报",
+ "eventIgnitionOn": "点火",
+ "eventIgnitionOff": "熄火",
+ "eventMaintenance": "需要维护",
+ "eventTextMessage": "已接收文本信息",
+ "eventDriverChanged": "驾驶员变更",
+ "eventMedia": "媒体",
+ "eventsScrollToLast": "移至最后",
+ "eventsSoundEvents": "事件铃声",
+ "eventsSoundAlarms": "报警铃声",
+ "alarmGeneral": "通常",
+ "alarmSos": "求救",
+ "alarmVibration": "振动",
+ "alarmMovement": "移动",
+ "alarmLowspeed": "低速",
+ "alarmOverspeed": "超速",
+ "alarmFallDown": "跌落",
+ "alarmLowPower": "低功率",
+ "alarmLowBattery": "低电量",
+ "alarmFault": "故障",
+ "alarmPowerOff": "关闭电源",
+ "alarmPowerOn": "开启电源",
+ "alarmDoor": "门",
+ "alarmLock": "锁定",
+ "alarmUnlock": "解锁",
+ "alarmGeofence": "围栏",
+ "alarmGeofenceEnter": "进入围栏",
+ "alarmGeofenceExit": "离开围栏",
+ "alarmGpsAntennaCut": "GPS 天线断开",
+ "alarmAccident": "事故",
+ "alarmTow": "拖",
+ "alarmIdle": "空转",
+ "alarmHighRpm": "高转速",
+ "alarmHardAcceleration": "急加速",
+ "alarmHardBraking": "急刹车",
+ "alarmHardCornering": "急转弯",
+ "alarmLaneChange": "车道改变",
+ "alarmFatigueDriving": "疲劳驾驶",
+ "alarmPowerCut": "断电",
+ "alarmPowerRestored": "电源恢复",
+ "alarmJamming": "干扰",
+ "alarmTemperature": "温度",
+ "alarmParking": "停车中",
+ "alarmBonnet": "阀盖",
+ "alarmFootBrake": "脚踏制动器",
+ "alarmFuelLeak": "燃油泄漏",
+ "alarmTampering": "干预",
+ "alarmRemoving": "移除中",
+ "notificationType": "通知类型",
+ "notificationAlways": "所有设备",
+ "notificationNotificators": "通道",
+ "notificatorCommand": "命令",
+ "notificatorWeb": "网页",
+ "notificatorMail": "邮件",
+ "notificatorSms": "短信",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram 账号",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "轨迹回放",
+ "reportCombined": "组合",
+ "reportRoute": "轨迹",
+ "reportEvents": "事件",
+ "reportTrips": "行程",
+ "reportStops": "停留点",
+ "reportSummary": "总览",
+ "reportDaily": "每日汇报",
+ "reportChart": "图表",
+ "reportConfigure": "筛选",
+ "reportEventTypes": "事件类型",
+ "reportChartType": "图表类型",
+ "reportShowMarkers": "显示图标",
+ "reportExport": "导出",
+ "reportEmail": "邮件发送",
+ "reportSchedule": "工作计划",
+ "reportPeriod": "时段",
+ "reportCustom": "自定义",
+ "reportToday": "今天",
+ "reportYesterday": "昨天",
+ "reportThisWeek": "本周",
+ "reportPreviousWeek": "上周",
+ "reportThisMonth": "本月",
+ "reportPreviousMonth": "上月",
+ "reportDeviceName": "设备名称",
+ "reportAverageSpeed": "平均速度",
+ "reportMaximumSpeed": "最大速度",
+ "reportEngineHours": "发动机使用时间",
+ "reportDuration": "持续时间",
+ "reportStartDate": "开始日期",
+ "reportStartTime": "开始时间",
+ "reportStartAddress": "开始地址",
+ "reportEndTime": "结束时间",
+ "reportEndAddress": "结束地址",
+ "reportSpentFuel": "燃油消耗",
+ "reportStartOdometer": "起始里程",
+ "reportEndOdometer": "结束里程",
+ "statisticsTitle": "统计",
+ "statisticsCaptureTime": "获取时间",
+ "statisticsActiveUsers": "活动用户",
+ "statisticsActiveDevices": "活动设备",
+ "statisticsRequests": "请求",
+ "statisticsMessagesReceived": "已收到消息",
+ "statisticsMessagesStored": "已存储消息",
+ "statisticsGeocoder": "地理编码请求",
+ "statisticsGeolocation": "地理定位请求",
+ "categoryArrow": "箭头",
+ "categoryDefault": "默认",
+ "categoryAnimal": "动物",
+ "categoryBicycle": "单车",
+ "categoryBoat": "船只",
+ "categoryBus": "巴士",
+ "categoryCar": "汽车",
+ "categoryCamper": "露营车",
+ "categoryCrane": "起重机",
+ "categoryHelicopter": "直升机",
+ "categoryMotorcycle": "摩托车",
+ "categoryOffroad": "越野车",
+ "categoryPerson": "人员",
+ "categoryPickup": "皮卡",
+ "categoryPlane": "飞机",
+ "categoryShip": "游轮",
+ "categoryTractor": "拖拉机",
+ "categoryTrain": "火车",
+ "categoryTram": "有轨电车",
+ "categoryTrolleybus": "无轨电车",
+ "categoryTruck": "卡车",
+ "categoryVan": "厢式货车",
+ "categoryScooter": "小型摩托车",
+ "maintenanceStart": "开启",
+ "maintenancePeriod": "时段"
+} \ No newline at end of file
diff --git a/legacy/web/l10n/zh_TW.json b/legacy/web/l10n/zh_TW.json
new file mode 100644
index 00000000..10cb88a8
--- /dev/null
+++ b/legacy/web/l10n/zh_TW.json
@@ -0,0 +1,600 @@
+{
+ "sharedLoading": "讀取資料中……",
+ "sharedHide": "隱藏",
+ "sharedSave": "存檔",
+ "sharedUpload": "上傳",
+ "sharedSet": "設定",
+ "sharedCancel": "取消",
+ "sharedCopy": "Copy",
+ "sharedAdd": "新增",
+ "sharedEdit": "編輯",
+ "sharedRemove": "移除",
+ "sharedRemoveConfirm": "確認要移除嗎?",
+ "sharedNoData": "沒有資料",
+ "sharedSubject": "Subject",
+ "sharedYes": "是",
+ "sharedNo": "否",
+ "sharedKm": "公里",
+ "sharedMi": "英里",
+ "sharedNmi": "海里",
+ "sharedMeters": "米",
+ "sharedFeet": "英尺",
+ "sharedKn": "節",
+ "sharedKmh": "公里/小時",
+ "sharedMph": "英里/小時",
+ "sharedHour": "小時",
+ "sharedMinute": "分鐘",
+ "sharedSecond": "秒",
+ "sharedDays": "天",
+ "sharedHours": "小時",
+ "sharedMinutes": "分鐘",
+ "sharedDecimalDegrees": "度",
+ "sharedDegreesDecimalMinutes": "分",
+ "sharedDegreesMinutesSeconds": "秒",
+ "sharedName": "名稱",
+ "sharedDescription": "描述",
+ "sharedSearch": "搜尋",
+ "sharedIconScale": "圖標比例",
+ "sharedGeofence": "地理圍籬",
+ "sharedGeofences": "地理圍籬",
+ "sharedCreateGeofence": "建立地理圍籬",
+ "sharedNotifications": "通知",
+ "sharedNotification": "通知",
+ "sharedAttributes": "屬性",
+ "sharedAttribute": "屬性",
+ "sharedDrivers": "駕駛",
+ "sharedDriver": "駕駛",
+ "sharedArea": "區域",
+ "sharedSound": "通知音效",
+ "sharedType": "類型",
+ "sharedDistance": "距離",
+ "sharedHourAbbreviation": "時",
+ "sharedMinuteAbbreviation": "分",
+ "sharedSecondAbbreviation": "秒",
+ "sharedVoltAbbreviation": "伏特",
+ "sharedLiterAbbreviation": "公升",
+ "sharedGallonAbbreviation": "加侖",
+ "sharedLiter": "升",
+ "sharedImpGallon": "英制加侖",
+ "sharedUsGallon": "美制加侖",
+ "sharedLiterPerHourAbbreviation": "公升/小時",
+ "sharedGetMapState": "取得地圖狀態",
+ "sharedComputedAttribute": "計算屬性",
+ "sharedComputedAttributes": "計算屬性",
+ "sharedCheckComputedAttribute": "檢查計算屬性",
+ "sharedExpression": "表示式",
+ "sharedDevice": "設備",
+ "sharedTest": "測試",
+ "sharedTestNotification": "傳送測試通知",
+ "sharedTestNotificators": "測試頻道",
+ "sharedTestExpression": "測試表示式",
+ "sharedCalendar": "日曆",
+ "sharedCalendars": "日曆",
+ "sharedFile": "檔案",
+ "sharedSearchDevices": "搜尋設備",
+ "sharedSortBy": "排序方式",
+ "sharedFilterMap": "在地圖上篩選",
+ "sharedSelectFile": "選擇檔案",
+ "sharedPhone": "手機",
+ "sharedRequired": "必需",
+ "sharedPreferences": "偏好",
+ "sharedPermissions": "權限",
+ "sharedConnections": "關聯",
+ "sharedExtra": "更多",
+ "sharedPrimary": "首要",
+ "sharedSecondary": "次要",
+ "sharedTypeString": "字串",
+ "sharedTypeNumber": "整數",
+ "sharedTypeBoolean": "布林值",
+ "sharedTimezone": "時區",
+ "sharedInfoTitle": "資訊",
+ "sharedSavedCommand": "儲存指令",
+ "sharedSavedCommands": "儲存指令",
+ "sharedNew": "新建",
+ "sharedShowAddress": "顯示地址",
+ "sharedShowDetails": "詳情請見",
+ "sharedDisabled": "關閉",
+ "sharedMaintenance": "保養",
+ "sharedDeviceAccumulators": "累加器",
+ "sharedAlarms": "警告",
+ "sharedLocation": "位置",
+ "sharedImport": "接入",
+ "sharedColumns": "列",
+ "sharedDropzoneText": "將文件拖放到此處或者點擊",
+ "sharedLogs": "Logs",
+ "sharedLink": "Link",
+ "calendarSimple": "簡單",
+ "calendarRecurrence": "復現",
+ "calendarOnce": "僅一次",
+ "calendarDaily": "每日",
+ "calendarWeekly": "每週",
+ "calendarMonthly": "每月",
+ "calendarDays": "天",
+ "calendarSunday": "周日",
+ "calendarMonday": "周一",
+ "calendarTuesday": "周二",
+ "calendarWednesday": "周三",
+ "calendarThursday": "周四",
+ "calendarFriday": "周五",
+ "calendarSaturday": "周六",
+ "attributeShowGeofences": "顯示地理圍籬",
+ "attributeSpeedLimit": "速限",
+ "attributeFuelDropThreshold": "燃油下降閾值",
+ "attributeFuelIncreaseThreshold": "燃料增加閾值",
+ "attributePolylineDistance": "折線距離",
+ "attributeReportIgnoreOdometer": "報告:忽略里程表",
+ "attributeWebReportColor": "網頁:報告顏色",
+ "attributeDevicePassword": "設備密碼",
+ "attributeDeviceImage": "設備圖片",
+ "attributeDeviceInactivityStart": "設備無回應起始",
+ "attributeDeviceInactivityPeriod": "設備無回應期間",
+ "attributeProcessingCopyAttributes": "處理中:複製屬性",
+ "attributeColor": "顏色",
+ "attributeWebLiveRouteLength": "網頁:即時軌跡長度",
+ "attributeWebSelectZoom": "網頁:選擇縮放等級",
+ "attributeWebMaxZoom": "網頁∶最大縮放",
+ "attributeTelegramChatId": "Telegram帳號",
+ "attributePushoverUserKey": "Pushover用戶密鑰",
+ "attributePushoverDeviceNames": "Pushover設備名稱",
+ "attributeMailSmtpHost": "電子郵件:SMTP 主機",
+ "attributeMailSmtpPort": "電子郵件:SMTP 埠口",
+ "attributeMailSmtpStarttlsEnable": "電子郵件:啟用 SMTP STARTTLS",
+ "attributeMailSmtpStarttlsRequired": "電子郵件:需要 SMTP STARTTLS",
+ "attributeMailSmtpSslEnable": "電子郵件:啟用 SMTP SSL",
+ "attributeMailSmtpSslTrust": "電子郵件:信任 SMTP SSL",
+ "attributeMailSmtpSslProtocols": "電子郵件:SMTP SSL 協定",
+ "attributeMailSmtpFrom": "電子郵件:SMTP 來源",
+ "attributeMailSmtpAuth": "電子郵件:啟用 SMTP 認證",
+ "attributeMailSmtpUsername": "電子郵件:SMTP 用戶名稱",
+ "attributeMailSmtpPassword": "電子郵件:SMTP 密碼",
+ "attributeUiDisableSavedCommands": "UI: Disable Saved Commands",
+ "attributeUiDisableAttributes": "用戶界面:禁用屬性",
+ "attributeUiDisableGroups": "用戶界面:禁用分組",
+ "attributeUiDisableEvents": "用戶界面:禁用事件",
+ "attributeUiDisableVehicleFeatures": "UI: Disable Vehicle Features",
+ "attributeUiDisableDrivers": "用戶界面:禁用駕駛員",
+ "attributeUiDisableComputedAttributes": "用戶界面:禁用計算屬性",
+ "attributeUiDisableCalendars": "用戶界面:禁用日曆",
+ "attributeUiDisableMaintenance": "用戶界面:禁用保養",
+ "attributeUiHidePositionAttributes": "用戶界面:隱藏位置屬性",
+ "attributeUiDisableLoginLanguage": "用戶界面:禁用登入語言",
+ "attributeNotificationTokens": "通知令牌",
+ "attributePopupInfo": "資訊卡",
+ "errorTitle": "錯誤",
+ "errorGeneral": "非法的參數或違反限制",
+ "errorConnection": "連線錯誤",
+ "errorSocket": "網頁接口連線錯誤",
+ "errorZero": "不能為零",
+ "userEmail": "電子郵件",
+ "userPassword": "密碼",
+ "userAdmin": "管理員",
+ "userRemember": "記住密碼",
+ "userExpirationTime": "有效期限",
+ "userDeviceLimit": "設備限制",
+ "userUserLimit": "用戶限制",
+ "userDeviceReadonly": "唯讀設備",
+ "userLimitCommands": "禁用指令",
+ "userDisableReports": "禁用報表",
+ "userFixedEmail": "禁止更改電子郵件",
+ "userToken": "簽證",
+ "userDeleteAccount": "刪除帳號",
+ "userTemporary": "Temporary",
+ "loginTitle": "登入",
+ "loginLanguage": "語言",
+ "loginReset": "密碼重設",
+ "loginRegister": "註冊",
+ "loginLogin": "登入",
+ "loginOpenId": "使用 OpenID 登入",
+ "loginFailed": "錯誤的電子信箱地址或密碼",
+ "loginCreated": "已成功註冊新用戶",
+ "loginResetSuccess": "郵件查詢",
+ "loginUpdateSuccess": "新密碼已重置",
+ "loginLogout": "登出",
+ "loginLogo": "標識",
+ "loginTotpCode": "One-time Password Code",
+ "loginTotpKey": "One-time Password Key",
+ "devicesAndState": "設備與狀態",
+ "deviceSelected": "已選定的設備",
+ "deviceTitle": "設備",
+ "devicePrimaryInfo": "設備標題",
+ "deviceSecondaryInfo": "設備詳情",
+ "deviceIdentifier": "識別號碼",
+ "deviceModel": "型號",
+ "deviceContact": "聯絡人",
+ "deviceCategory": "分類",
+ "deviceLastUpdate": "最近更新",
+ "deviceCommand": "命令",
+ "deviceFollow": "跟隨",
+ "deviceTotalDistance": "總距離",
+ "deviceStatus": "狀態",
+ "deviceStatusOnline": "上線",
+ "deviceStatusOffline": "下線",
+ "deviceStatusUnknown": "未知",
+ "deviceRegisterFirst": "註冊您的首個設備",
+ "deviceIdentifierHelp": "IMEI、序列號或其他 ID。必須與設備回報到伺服器的識別碼相同。",
+ "deviceShare": "Share Device",
+ "groupDialog": "群組",
+ "groupParent": "上層群組",
+ "groupNoGroup": "無所屬群組",
+ "settingsTitle": "設定",
+ "settingsUser": "用戶",
+ "settingsGroups": "群組",
+ "settingsServer": "伺服器",
+ "settingsUsers": "用戶",
+ "settingsDistanceUnit": "距離單位",
+ "settingsAltitudeUnit": "高度單位",
+ "settingsSpeedUnit": "速度單位",
+ "settingsVolumeUnit": "體積單位",
+ "settingsTwelveHourFormat": "十二小時制",
+ "settingsCoordinateFormat": "座標格式",
+ "settingsServerVersion": "服務器版本",
+ "settingsAppVersion": "應用版本",
+ "settingsConnection": "連接",
+ "settingsDarkMode": "夜間模式",
+ "settingsTotpEnable": "Enable One-time Password",
+ "settingsTotpForce": "Force One-time Password",
+ "settingsServiceWorkerUpdateInterval": "ServiceWorker Update Interval",
+ "settingsUpdateAvailable": "There is an update available.",
+ "settingsSupport": "Support",
+ "reportTitle": "報告",
+ "reportScheduled": "已排程的報告",
+ "reportDevice": "設備",
+ "reportGroup": "群組",
+ "reportFrom": "開始",
+ "reportTo": "至",
+ "reportShow": "顯示",
+ "reportClear": "清空",
+ "linkGoogleMaps": "Google 地圖",
+ "linkAppleMaps": "蘋果地圖",
+ "linkStreetView": "街景",
+ "positionFixTime": "定位時間",
+ "positionDeviceTime": "設備時間",
+ "positionServerTime": "伺服器時間",
+ "positionValid": "有效",
+ "positionAccuracy": "精準度",
+ "positionLatitude": "緯度",
+ "positionLongitude": "經度",
+ "positionAltitude": "海拔",
+ "positionSpeed": "速率",
+ "positionCourse": "方向",
+ "positionAddress": "地址",
+ "positionProtocol": "協定",
+ "positionDistance": "距離",
+ "positionRpm": "轉速",
+ "positionFuel": "燃油",
+ "positionPower": "電源",
+ "positionBattery": "電池",
+ "positionRaw": "Raw",
+ "positionIndex": "索引",
+ "positionHdop": "HDOP",
+ "positionVdop": "VDOP",
+ "positionPdop": "PDOP",
+ "positionSat": "衛星",
+ "positionSatVisible": "可見衛星",
+ "positionRssi": "RSSI",
+ "positionGps": "GPS",
+ "positionRoaming": "漫遊",
+ "positionEvent": "事件",
+ "positionAlarm": "提醒",
+ "positionStatus": "狀態",
+ "positionOdometer": "里程表",
+ "positionServiceOdometer": "伺服器里程表",
+ "positionTripOdometer": "旅程里程表",
+ "positionHours": "小時",
+ "positionSteps": "步驟",
+ "positionInput": "輸入",
+ "positionHeartRate": "心跳",
+ "positionOutput": "輸出",
+ "positionBatteryLevel": "電池計量",
+ "positionFuelConsumption": "燃油消耗",
+ "positionRfid": "RFID",
+ "positionVersionFw": "韌體版本",
+ "positionVersionHw": "更體版本",
+ "positionIgnition": "點火",
+ "positionFlags": "旗標",
+ "positionCharge": "充電",
+ "positionIp": "IP",
+ "positionArchive": "車籍",
+ "positionVin": "車輛識別號碼",
+ "positionApproximate": "約",
+ "positionThrottle": "油門",
+ "positionMotion": "移動",
+ "positionArmed": "警報",
+ "positionAcceleration": "加速",
+ "positionTemp": "溫度",
+ "positionDeviceTemp": "設備溫度",
+ "positionCoolantTemp": "水冷液溫度",
+ "positionOperator": "司機",
+ "positionCommand": "命令",
+ "positionBlocked": "已封鎖",
+ "positionDtcs": "動態扭力控制",
+ "positionObdSpeed": "車上診斷系統速率",
+ "positionObdOdometer": "車上診斷系統里程表",
+ "positionDrivingTime": "行駛時間",
+ "positionDriverUniqueId": "駕駛唯一識別號碼",
+ "positionCard": "卡片",
+ "positionImage": "圖片",
+ "positionVideo": "影片",
+ "positionAudio": "音頻",
+ "serverTitle": "伺服器設定",
+ "serverZoom": "縮放",
+ "serverRegistration": "註冊",
+ "serverReadonly": "唯讀",
+ "serverForceSettings": "強制覆寫設定",
+ "serverAnnouncement": "公告",
+ "serverName": "伺服器名稱",
+ "serverDescription": "伺服器描述",
+ "serverColorPrimary": "主顏色",
+ "serverColorSecondary": "次顏色",
+ "serverLogo": "Logo 圖片",
+ "serverLogoInverted": "倒置 Logo 圖片",
+ "serverChangeDisable": "禁改伺服器",
+ "serverDisableShare": "Disable Device Sharing",
+ "mapTitle": "地圖",
+ "mapActive": "啟用地圖",
+ "mapOverlay": "地圖疊層",
+ "mapOverlayCustom": "自定義疊層",
+ "mapOpenSeaMap": "OpenSea地圖",
+ "mapOpenRailwayMap": "鐵路地圖",
+ "mapOpenWeatherKey": "OpenWeather API密鑰",
+ "mapOpenWeatherClouds": "OpenWeather雲層圖",
+ "mapOpenWeatherPrecipitation": "OpenWeather降水圖",
+ "mapOpenWeatherPressure": "OpenWeather氣壓圖",
+ "mapOpenWeatherWind": "OpenWeather 風力圖",
+ "mapOpenWeatherTemperature": "OpenWeather氣溫圖",
+ "mapLayer": "地圖圖層",
+ "mapCustom": "自定義(XYZ)",
+ "mapCustomArcgis": "自定義(ArcGIS)",
+ "mapCustomLabel": "自定義地圖",
+ "mapCarto": "CARTO 地圖",
+ "mapOsm": "OpenStreet地圖",
+ "mapGoogleRoad": "Google 道路地圖",
+ "mapGoogleHybrid": "Google 混合地圖",
+ "mapGoogleSatellite": "Google 衛星地圖",
+ "mapOpenTopoMap": "OpenTopo地圖",
+ "mapBingKey": "Bing 地圖金鑰",
+ "mapBingRoad": "Bing 道路地圖",
+ "mapBingAerial": "Bing 空照圖地圖",
+ "mapBingHybrid": "Bing 溫合地圖",
+ "mapBaidu": "百度",
+ "mapAutoNavi": "高德地圖",
+ "mapYandexMap": "Yandex 地圖",
+ "mapYandexSat": "Yandex 衛星",
+ "mapWikimedia": "維基百科",
+ "mapOrdnanceSurvey": "英國地形測量局",
+ "mapMapboxStreets": "Mapbox 街道",
+ "mapMapboxStreetsDark": "Mapbox Streets Dark",
+ "mapMapboxOutdoors": "Mapbox 外景",
+ "mapMapboxSatellite": "Mapbox 衛星地圖",
+ "mapMapboxKey": "Maxbox 訪問令牌",
+ "mapMapTilerBasic": "MapTiler基礎地圖",
+ "mapMapTilerHybrid": "MapTiler混合地圖",
+ "mapMapTilerKey": "MapTiler API密鑰",
+ "mapLocationIqStreets": "LocationIQ街道地圖",
+ "mapLocationIqDark": "LocationIQ 黑主題",
+ "mapLocationIqKey": "LocationIQ訪問指令牌",
+ "mapTomTomBasic": "TomTom基礎地圖",
+ "mapTomTomFlow": "TomTom交通路況",
+ "mapTomTomIncidents": "TomTom交通事故",
+ "mapTomTomKey": "TomTom API密鑰",
+ "mapHereBasic": "Here基礎地圖",
+ "mapHereHybrid": "Here混合地圖",
+ "mapHereSatellite": "Here衛星地圖",
+ "mapHereFlow": "Here交通路况",
+ "mapHereKey": "Here API密鑰",
+ "mapShapePolygon": "多邊形",
+ "mapShapeCircle": "圓形",
+ "mapShapePolyline": "多邊形",
+ "mapLiveRoutes": "即時軌跡",
+ "mapDirection": "顯示方向",
+ "mapCurrentLocation": "當前位置",
+ "mapPoiLayer": "POI 圖層",
+ "mapClustering": "標記叢集",
+ "mapOnSelect": "選擇設備時顯示地圖",
+ "mapDefault": "預設地圖",
+ "stateTitle": "狀態",
+ "stateName": "名稱",
+ "stateValue": "數值",
+ "commandTitle": "命令",
+ "commandSend": "傳送",
+ "commandSent": "指令已發送",
+ "commandQueued": "指令已排隊",
+ "commandUnit": "單位",
+ "commandCustom": "自訂命令",
+ "commandDeviceIdentification": "設備識別號碼",
+ "commandPositionSingle": "個別報告",
+ "commandPositionPeriodic": "定期報告",
+ "commandPositionStop": "停止報告",
+ "commandEngineStop": "停止引擎",
+ "commandEngineResume": "恢復引擎",
+ "commandAlarmArm": "啟動警報",
+ "commandAlarmDisarm": "解除警報",
+ "commandAlarmDismiss": "解除警報",
+ "commandSetTimezone": "設定時區",
+ "commandRequestPhoto": "請求照片",
+ "commandPowerOff": "設備關機",
+ "commandRebootDevice": "重啟設備",
+ "commandFactoryReset": "回復原廠設定",
+ "commandSendSms": "傳送簡訊",
+ "commandSendUssd": "傳送 USSD 簡訊",
+ "commandSosNumber": "設定救援號碼",
+ "commandSilenceTime": "設定靜音時段",
+ "commandSetPhonebook": "設定電話簿",
+ "commandVoiceMessage": "語音訊息",
+ "commandOutputControl": "輸出控制",
+ "commandVoiceMonitoring": "語音監控",
+ "commandSetAgps": "設定 AGPS",
+ "commandSetIndicator": "設定指標",
+ "commandConfiguration": "設置",
+ "commandGetVersion": "獲取版本",
+ "commandFirmwareUpdate": "更新韌體",
+ "commandSetConnection": "設置連接",
+ "commandSetOdometer": "設置里程表",
+ "commandGetModemStatus": "獲取數據機狀態",
+ "commandGetDeviceStatus": "獲取設備狀態",
+ "commandSetSpeedLimit": "設置速度限制",
+ "commandModePowerSaving": "省電模式",
+ "commandModeDeepSleep": "睡眠模式",
+ "commandAlarmGeofence": "設定地理圍籬警報",
+ "commandAlarmBattery": "設置電池警報",
+ "commandAlarmSos": "設置SOS警報",
+ "commandAlarmRemove": "設置刪除警報",
+ "commandAlarmClock": "設置時鐘警報",
+ "commandAlarmSpeed": "設置速度警報",
+ "commandAlarmFall": "設置掉落警報",
+ "commandAlarmVibration": "設置震動警報",
+ "commandFrequency": "頻率",
+ "commandTimezone": "時區",
+ "commandMessage": "訊息",
+ "commandRadius": "半徑",
+ "commandEnable": "啟用",
+ "commandData": "資料",
+ "commandIndex": "索引",
+ "commandPhone": "電話號碼",
+ "commandServer": "服務器",
+ "commandPort": "端口",
+ "eventAll": "所有事件",
+ "eventDeviceOnline": "已上線",
+ "eventDeviceUnknown": "未知狀態",
+ "eventDeviceOffline": "已下線",
+ "eventDeviceInactive": "設備無回應",
+ "eventQueuedCommandSent": "已發送排列命令",
+ "eventDeviceMoving": "設備移動中",
+ "eventDeviceStopped": "設備已停止",
+ "eventDeviceOverspeed": "超速限制",
+ "eventDeviceFuelDrop": "燃油下降",
+ "eventDeviceFuelIncrease": "燃油增加",
+ "eventCommandResult": "命令結果",
+ "eventGeofenceEnter": "已進入地理圍籬",
+ "eventGeofenceExit": "已離開地理圍籬",
+ "eventAlarm": "警報",
+ "eventIgnitionOn": "點火",
+ "eventIgnitionOff": "熄火",
+ "eventMaintenance": "需要保養",
+ "eventTextMessage": "已接收文字訊息",
+ "eventDriverChanged": "駕駛員變更",
+ "eventMedia": "多媒體",
+ "eventsScrollToLast": "卷軸已拉到底",
+ "eventsSoundEvents": "事件鈴聲",
+ "eventsSoundAlarms": "警報鈴聲",
+ "alarmGeneral": "一般",
+ "alarmSos": "求救",
+ "alarmVibration": "震動",
+ "alarmMovement": "移動",
+ "alarmLowspeed": "低速",
+ "alarmOverspeed": "超速",
+ "alarmFallDown": "跌落",
+ "alarmLowPower": "低電量",
+ "alarmLowBattery": "電池低電量",
+ "alarmFault": "故障",
+ "alarmPowerOff": "關機",
+ "alarmPowerOn": "開機",
+ "alarmDoor": "車門",
+ "alarmLock": "鎖定",
+ "alarmUnlock": "解鎖",
+ "alarmGeofence": "地理圍籬",
+ "alarmGeofenceEnter": "進入地理圍籬",
+ "alarmGeofenceExit": "離開地理圍籬",
+ "alarmGpsAntennaCut": "GPS天線斷開",
+ "alarmAccident": "事故",
+ "alarmTow": "牽引",
+ "alarmIdle": "怠速",
+ "alarmHighRpm": "高轉速",
+ "alarmHardAcceleration": "急加速",
+ "alarmHardBraking": "急剎車",
+ "alarmHardCornering": "急轉彎",
+ "alarmLaneChange": "改變車道",
+ "alarmFatigueDriving": "疲勞駕駛",
+ "alarmPowerCut": "斷電",
+ "alarmPowerRestored": "恢復電源",
+ "alarmJamming": "干擾",
+ "alarmTemperature": "溫度",
+ "alarmParking": "停車處",
+ "alarmBonnet": "引擎蓋",
+ "alarmFootBrake": "腳剎",
+ "alarmFuelLeak": "漏油",
+ "alarmTampering": "篡改",
+ "alarmRemoving": "移除中",
+ "notificationType": "通知類型",
+ "notificationAlways": "所有設備",
+ "notificationNotificators": "通道",
+ "notificatorCommand": "指令",
+ "notificatorWeb": "網頁",
+ "notificatorMail": "電子郵件",
+ "notificatorSms": "簡訊",
+ "notificatorFirebase": "Firebase",
+ "notificatorTraccar": "Traccar",
+ "notificatorTelegram": "Telegram",
+ "notificatorPushover": "Pushover",
+ "reportReplay": "軌跡回放",
+ "reportCombined": "合併",
+ "reportRoute": "路線",
+ "reportEvents": "事件",
+ "reportTrips": "旅程",
+ "reportStops": "站點",
+ "reportSummary": "摘要",
+ "reportDaily": "每日匯報",
+ "reportChart": "圖表",
+ "reportConfigure": "設置",
+ "reportEventTypes": "事件類型",
+ "reportChartType": "圖表類型",
+ "reportShowMarkers": "顯示地標",
+ "reportExport": "匯出",
+ "reportEmail": "郵件發送",
+ "reportSchedule": "排程",
+ "reportPeriod": "期間",
+ "reportCustom": "自定義",
+ "reportToday": "今天",
+ "reportYesterday": "昨天",
+ "reportThisWeek": "本週",
+ "reportPreviousWeek": "上週",
+ "reportThisMonth": "本月",
+ "reportPreviousMonth": "上月",
+ "reportDeviceName": "設備名稱",
+ "reportAverageSpeed": "平均速率",
+ "reportMaximumSpeed": "最高速率",
+ "reportEngineHours": "引擎時數",
+ "reportDuration": "持續時間",
+ "reportStartDate": "起始日期",
+ "reportStartTime": "起始時間",
+ "reportStartAddress": "起始地點",
+ "reportEndTime": "結束時間",
+ "reportEndAddress": "結束地點",
+ "reportSpentFuel": "燃油消耗",
+ "reportStartOdometer": "起始里程",
+ "reportEndOdometer": "結束里程",
+ "statisticsTitle": "統計",
+ "statisticsCaptureTime": "截取時間",
+ "statisticsActiveUsers": "活躍用戶量",
+ "statisticsActiveDevices": "活躍設備量",
+ "statisticsRequests": "請求數",
+ "statisticsMessagesReceived": "已接收訊息量",
+ "statisticsMessagesStored": "已儲存訊息量",
+ "statisticsGeocoder": "地理碼請求數",
+ "statisticsGeolocation": "地理座標請求數",
+ "categoryArrow": "箭頭",
+ "categoryDefault": "預設",
+ "categoryAnimal": "動物",
+ "categoryBicycle": "自行車",
+ "categoryBoat": "船舶",
+ "categoryBus": "公車",
+ "categoryCar": "小客車",
+ "categoryCamper": "Camper",
+ "categoryCrane": "起重機",
+ "categoryHelicopter": "直昇機",
+ "categoryMotorcycle": "機車",
+ "categoryOffroad": "越野車",
+ "categoryPerson": "行人",
+ "categoryPickup": "皮卡車",
+ "categoryPlane": "飛機",
+ "categoryShip": "船艦",
+ "categoryTractor": "曳引機",
+ "categoryTrain": "火車",
+ "categoryTram": "有軌電車",
+ "categoryTrolleybus": "無軌電車",
+ "categoryTruck": "貨車",
+ "categoryVan": "箱型車",
+ "categoryScooter": "小型摩拖車",
+ "maintenanceStart": "起始值",
+ "maintenancePeriod": "期間"
+} \ No newline at end of file
diff --git a/legacy/web/load.js b/legacy/web/load.js
new file mode 100644
index 00000000..482a059a
--- /dev/null
+++ b/legacy/web/load.js
@@ -0,0 +1,183 @@
+(function () {
+ var debugMode, touchMode, locale, localeParameter, extjsVersion, proj4jsVersion, olVersion, i, language, languages, languageDefault;
+
+ function addStyleFile(file) {
+ var link = document.createElement('link');
+ link.setAttribute('rel', 'stylesheet');
+ link.setAttribute('type', 'text/css');
+ link.setAttribute('href', file);
+ document.head.appendChild(link);
+ }
+
+ function addScriptFile(file) {
+ var script = document.createElement('script');
+ script.setAttribute('src', file);
+ script.async = false;
+ document.head.appendChild(script);
+ }
+
+ function addSvgFile(file, id) {
+ var svg = document.createElement('object');
+ svg.setAttribute('id', id);
+ svg.setAttribute('data', file);
+ svg.setAttribute('type', 'image/svg+xml');
+ svg.setAttribute('style', 'visibility:hidden;position:absolute;left:-100px;');
+ document.body.appendChild(svg);
+ }
+
+ debugMode = document.getElementById('loadScript').getAttribute('mode') === 'debug';
+ touchMode = 'ontouchstart' in window || navigator.maxTouchPoints;
+
+ window.updateNotificationToken = function (token) {
+ Traccar.app.updateNotificationToken(token);
+ };
+
+ locale = {};
+ window.Locale = locale;
+
+ locale.languages = {
+ 'af': { name: 'Afrikaans', code: 'af' },
+ 'ar': { name: 'العربية', code: 'en' },
+ 'az': { name: 'Azərbaycanca', code: 'en' },
+ 'bg': { name: 'Български', code: 'bg' },
+ 'bn': { name: 'বাংলা', code: 'en' },
+ 'ca': { name: 'Català', code: 'en' },
+ 'cs': { name: 'Čeština', code: 'cs' },
+ 'de': { name: 'Deutsch', code: 'de' },
+ 'da': { name: 'Dansk', code: 'da' },
+ 'el': { name: 'Ελληνικά', code: 'el' },
+ 'en': { name: 'English', code: 'en' },
+ 'es': { name: 'Español', code: 'es' },
+ 'fa': { name: 'فارسی', code: 'fa' },
+ 'fi': { name: 'Suomi', code: 'fi' },
+ 'fr': { name: 'Français', code: 'fr' },
+ 'he': { name: 'עברית', code: 'he' },
+ 'hi': { name: 'हिन्दी', code: 'en' },
+ 'hr': { name: 'Hrvatski', code: 'hr' },
+ 'hu': { name: 'Magyar', code: 'hu' },
+ 'id': { name: 'Bahasa Indonesia', code: 'id' },
+ 'it': { name: 'Italiano', code: 'it' },
+ 'ja': { name: '日本語', code: 'ja' },
+ 'ka': { name: 'ქართული', code: 'en' },
+ 'kk': { name: 'Қазақша', code: 'en' },
+ 'ko': { name: '한국어', code: 'ko' },
+ 'km': { name: 'ភាសាខ្មែរ', code: 'en' },
+ 'lo': { name: 'ລາວ', code: 'en' },
+ 'lt': { name: 'Lietuvių', code: 'lt' },
+ 'lv': { name: 'Latviešu', code: 'lv' },
+ 'ml': { name: 'മലയാളം', code: 'en' },
+ 'mn': { name: 'Монгол хэл', code: 'en' },
+ 'ms': { name: 'بهاس ملايو', code: 'en' },
+ 'nb': { name: 'Norsk bokmål', code: 'no_NB' },
+ 'ne': { name: 'नेपाली', code: 'en' },
+ 'nl': { name: 'Nederlands', code: 'nl' },
+ 'nn': { name: 'Norsk nynorsk', code: 'no_NN' },
+ 'pl': { name: 'Polski', code: 'pl' },
+ 'pt': { name: 'Português', code: 'pt' },
+ 'pt_BR': { name: 'Português (Brasil)', code: 'pt_BR' },
+ 'ro': { name: 'Română', code: 'ro' },
+ 'ru': { name: 'Русский', code: 'ru' },
+ 'si': { name: 'සිංහල', code: 'en' },
+ 'sk': { name: 'Slovenčina', code: 'sk' },
+ 'sl': { name: 'Slovenščina', code: 'sl' },
+ 'sq': { name: 'Shqipëria', code: 'en' },
+ 'sr': { name: 'Srpski', code: 'sr' },
+ 'sv': { name: 'Svenska', code: 'sv' },
+ 'ta': { name: 'தமிழ்', code: 'en' },
+ 'th': { name: 'ไทย', code: 'th' },
+ 'tr': { name: 'Türkçe', code: 'tr' },
+ 'uk': { name: 'Українська', code: 'ukr' },
+ 'uz': { name: 'Oʻzbekcha', code: 'en' },
+ 'vi': { name: 'Tiếng Việt', code: 'en' },
+ 'zh': { name: '中文', code: 'zh_CN' },
+ 'zh_TW': { name: '中文 (Taiwan)', code: 'zh_TW' }
+ };
+
+ languageDefault = 'en';
+ localeParameter = window.location.search.match(/locale=([^&#]+)/);
+ locale.language = localeParameter && localeParameter[1];
+ if (!(locale.language in locale.languages)) {
+ languages = window.navigator.languages !== undefined ? window.navigator.languages.slice() : [];
+ language = window.navigator.userLanguage || window.navigator.language;
+ languages.push(language);
+ languages.push(language.substring(0, 2));
+ languages.push(languageDefault);
+ for (i = 0; i < languages.length; i++) {
+ language = languages[i].replace('-', '_');
+ if (language in locale.languages) {
+ locale.language = language;
+ break;
+ }
+ if (language.length > 2) {
+ language = languages[i].substring(0, 2);
+ if (language in locale.languages) {
+ locale.language = language;
+ break;
+ }
+ }
+ }
+ }
+
+ window.addEventListener('load', function (event) {
+
+ if (debugMode) {
+ Ext.Loader.setConfig({
+ disableCaching: false
+ });
+ }
+
+ Ext.Ajax.request({
+ url: 'l10n/' + languageDefault + '.json',
+ callback: function (options, success, response) {
+ window.Strings = Ext.decode(response.responseText);
+ if (Locale.language !== languageDefault) {
+ Ext.Ajax.request({
+ url: 'l10n/' + Locale.language + '.json',
+ callback: function (options, success, response) {
+ var key, data = Ext.decode(response.responseText);
+ for (key in data) {
+ if (data.hasOwnProperty(key)) {
+ window.Strings[key] = data[key];
+ }
+ }
+ addScriptFile(debugMode ? 'app.js' : 'app.min.js');
+ }
+ });
+ } else {
+ addScriptFile(debugMode ? 'app.js' : 'app.min.js');
+ }
+ }
+ });
+
+ });
+
+ // Hack for new versions of Android
+ if (navigator.userAgent.indexOf('Android') !== -1 && navigator.userAgent.indexOf('OPR') !== -1) {
+ var __originalUserAgent = navigator.userAgent;
+ navigator.__defineGetter__('userAgent', function () { return __originalUserAgent.replace(/\/OPR[^)]*/g, ''); });
+ }
+
+ addScriptFile('lib/extjs/ext-all.js');
+ addScriptFile('lib/extjs/classic/locale/locale-' + locale.languages[locale.language].code + '.js');
+
+ addStyleFile('lib/extjs/classic/theme-triton/resources/theme-triton-all.css');
+ addScriptFile('lib/extjs/classic/theme-triton/theme-triton.js');
+
+ addScriptFile('lib/extjs/packages/charts/classic/charts.js');
+ addStyleFile('lib/extjs/packages/charts/classic/triton/resources/charts-all.css');
+
+ addStyleFile('lib/ol/ol.css');
+ addScriptFile('lib/ol/ol.js');
+
+ addStyleFile('lib/ol-layerswitcher/ol-layerswitcher.css');
+ addScriptFile('lib/ol-layerswitcher/ol-layerswitcher.js');
+
+ addScriptFile('lib/proj4/proj4.js');
+
+ window.Images = ['arrow', 'default', 'animal', 'bicycle', 'boat', 'bus', 'car', 'crane', 'helicopter', 'motorcycle',
+ 'offroad', 'person', 'pickup', 'plane', 'ship', 'tractor', 'train', 'tram', 'trolleybus', 'truck', 'van', 'scooter'];
+
+ for (i = 0; i < window.Images.length; i++) {
+ addSvgFile('images/' + window.Images[i] + '.svg', window.Images[i] + 'Svg');
+ }
+})();
diff --git a/legacy/web/logo.svg b/legacy/web/logo.svg
new file mode 100644
index 00000000..8183831f
--- /dev/null
+++ b/legacy/web/logo.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg id="svg2985" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="64" viewBox="0 0 240 64" width="240" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <g id="img">
+ <rect id="rect3778" height="64" width="240" y="0" x="0" fill="none"/>
+ <g id="g4194">
+ <g id="g4145" fill="currentColor">
+ <circle id="path2993" stroke-width="1.3262" transform="rotate(-30)" cy="43.713" cx="9.4364" r="2.2765"/>
+ <path id="path3004" stroke-width="1.0095" d="m37.012 24.177-2.8428 3.6128c0.66345 0.52205 1.3255 1.1576 1.7734 1.9333 0.4479 0.77578 0.66726 1.6669 0.78764 2.5025l4.5502-0.65558c-0.193-1.42-0.633-2.804-1.394-4.123s-1.74-2.391-2.874-3.27z"/>
+ <path id="path3014" stroke-width="1.0095" d="m42.504 16.9-2.8428 3.6128c1.607 1.2355 3.0914 2.7935 4.1679 4.6581s1.6835 3.9291 1.95 5.9386l4.5502-0.65558c-0.33967-2.5954-1.1669-5.1513-2.5573-7.5594-1.3903-2.4081-3.1901-4.4025-5.268-5.9944z"/>
+ <path id="path3036" stroke-width="3.6204" d="m28.667 44.439a9.1058 9.1058 0 0 1 -9.1058 0.000023 9.1058 9.1058 0 0 1 -4.5529 -7.8859 9.1058 9.1058 0 0 1 4.5529 -7.8859l4.5529 7.8859z"/>
+ <path id="path3038-8" stroke-width="1.0095" d="m17.502 6.8895c-13.868 8.0065-18.619 25.74-10.612 39.608 8.006 13.868 25.739 18.619 39.608 10.613 13.868-8.007 18.619-25.74 10.613-39.609-8.007-13.868-25.74-18.62-39.609-10.612zm1.706 2.9541c12.237-7.0648 27.884-2.8722 34.948 9.3644 7.065 12.237 2.873 27.884-9.364 34.948-12.237 7.065-27.884 2.873-34.948-9.364-7.0652-12.237-2.8726-27.884 9.364-34.948z"/>
+ </g>
+ </g>
+ <g id="logotext" aria-label="Traccar" fill="currentColor">
+ <path id="path4172" d="m89.719 48.671h-3.915v-30.192h-10.663v-3.4775h25.241v3.4775h-10.663v30.192z"/>
+ <path id="path4174" d="m116.36 22.969q1.6812 0 3.0169 0.27636l-0.52968 3.5466q-1.566-0.34544-2.7636-0.34544-3.063 0-5.2508 2.4872-2.1648 2.4872-2.1648 6.195v13.541h-3.8229v-25.241h3.1551l0.43756 4.675h0.18424q1.4048-2.4642 3.3854-3.7999t4.3526-1.3357z"/>
+ <path id="path4176" d="m139.62 48.671-0.75998-3.5926h-0.18424q-1.8884 2.3721-3.7769 3.2242-1.8654 0.82907-4.675 0.82907-3.7538 0-5.8956-1.9345-2.1187-1.9345-2.1187-5.5041 0-7.6459 12.229-8.0143l4.2835-0.13818v-1.566q0-2.9708-1.2897-4.3756-1.2666-1.4278-4.0763-1.4278-3.1551 0-7.1392 1.9345l-1.1745-2.9248q1.8654-1.0133 4.0762-1.589 2.2339-0.57574 4.4678-0.57574 4.5138 0 6.6786 2.0036 2.1878 2.0036 2.1878 6.4253v17.226h-2.8326zm-8.6361-2.6945q3.5696 0 5.5962-1.9575 2.0496-1.9575 2.0496-5.4811v-2.2799l-3.8229 0.16121q-4.5599 0.16121-6.5865 1.4278-2.0036 1.2436-2.0036 3.892 0 2.0727 1.2436 3.1551 1.2666 1.0824 3.5236 1.0824z"/>
+ <path id="path4178" d="m160.44 49.131q-5.4811 0-8.498-3.3623-2.9939-3.3854-2.9939-9.5573 0-6.3332 3.0399-9.7876 3.063-3.4545 8.7052-3.4545 1.8194 0 3.6387 0.3915t2.8557 0.92119l-1.1745 3.2472q-1.2666-0.50665-2.7636-0.82907-1.4969-0.34544-2.6484-0.34544-7.6919 0-7.6919 9.8106 0 4.652 1.8654 7.1392 1.8884 2.4872 5.5732 2.4872 3.1551 0 6.4713-1.3588v3.3854q-2.5333 1.3127-6.3792 1.3127z"/>
+ <path id="path4180" d="m182.92 49.131q-5.4811 0-8.498-3.3623-2.9939-3.3854-2.9939-9.5573 0-6.3332 3.0399-9.7876 3.063-3.4545 8.7052-3.4545 1.8193 0 3.6387 0.3915t2.8557 0.92119l-1.1745 3.2472q-1.2666-0.50665-2.7636-0.82907-1.4969-0.34544-2.6484-0.34544-7.6919 0-7.6919 9.8106 0 4.652 1.8654 7.1392 1.8884 2.4872 5.5732 2.4872 3.1551 0 6.4714-1.3588v3.3854q-2.5333 1.3127-6.3792 1.3127z"/>
+ <path id="path4182" d="m210.83 48.671-0.75998-3.5926h-0.18424q-1.8884 2.3721-3.7769 3.2242-1.8654 0.82907-4.675 0.82907-3.7538 0-5.8956-1.9345-2.1187-1.9345-2.1187-5.5041 0-7.6459 12.229-8.0143l4.2835-0.13818v-1.566q0-2.9708-1.2897-4.3756-1.2666-1.4278-4.0762-1.4278-3.1551 0-7.1392 1.9345l-1.1745-2.9248q1.8654-1.0133 4.0762-1.589 2.2339-0.57574 4.4678-0.57574 4.5138 0 6.6786 2.0036 2.1878 2.0036 2.1878 6.4253v17.226h-2.8326zm-8.6361-2.6945q3.5696 0 5.5962-1.9575 2.0496-1.9575 2.0496-5.4811v-2.2799l-3.8229 0.16121q-4.5599 0.16121-6.5865 1.4278-2.0036 1.2436-2.0036 3.892 0 2.0727 1.2436 3.1551 1.2666 1.0824 3.5235 1.0824z"/>
+ <path id="path4184" d="m233.08 22.969q1.6812 0 3.0169 0.27636l-0.52968 3.5466q-1.566-0.34544-2.7636-0.34544-3.0629 0-5.2508 2.4872-2.1648 2.4872-2.1648 6.195v13.541h-3.8229v-25.241h3.1551l0.43757 4.675h0.18423q1.4048-2.4642 3.3854-3.7999t4.3526-1.3357z"/>
+ </g>
+ </g>
+</svg>
diff --git a/legacy/web/release.html b/legacy/web/release.html
new file mode 100644
index 00000000..44561ff3
--- /dev/null
+++ b/legacy/web/release.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+<title>${title}</title>
+<link rel="icon" sizes="192x192" href="/icon.png">
+<link rel="apple-touch-icon" href="/apple-touch-icon.png">
+<link rel="stylesheet" href="app.css">
+</head>
+<body>
+<div id="spinner"></div>
+<div id="attribution">Powered by <a href="https://www.traccar.org/" target="_blank">Traccar GPS Tracking System</a></div>
+<script id="loadScript" src="load.js"></script>
+</body>
+</html>
diff --git a/legacy/web/simple/index.html b/legacy/web/simple/index.html
new file mode 100644
index 00000000..4df77259
--- /dev/null
+++ b/legacy/web/simple/index.html
@@ -0,0 +1,238 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>Traccar</title>
+<link href="https://unpkg.com/@picocss/pico@2.0.6/css/pico.min.css" rel="stylesheet">
+<link href="https://unpkg.com/maplibre-gl@4.1.2/dist/maplibre-gl.css" rel="stylesheet">
+</head>
+<body style="margin: 0; padding: 0;">
+<div id="content" style="width: 100%; height: 100%; position:fixed;"></div>
+<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
+<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
+<script src="https://unpkg.com/maplibre-gl@4.1.2/dist/maplibre-gl.js"></script>
+<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
+<script type="text/babel">
+
+ const LoginScreen = ({ server, setServer, setUser }) => {
+ const [email, setEmail] = React.useState('');
+ const [password, setPassword] = React.useState('');
+
+ const handleSubmit = (event) => {
+ event.preventDefault();
+ const fetchData = async () => {
+ if (server.newServer) {
+ const response = await fetch('/api/users', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ name: email, email, password }),
+ });
+ if (response.ok) {
+ setServer({ ...server, newServer: false });
+ }
+ } else {
+ const query = `email=${encodeURIComponent(email)}&password=${encodeURIComponent(password)}`;
+ const response = await fetch('/api/session', {
+ method: 'POST',
+ body: new URLSearchParams(query),
+ });
+ if (response.ok) {
+ setUser(await response.json());
+ }
+ }
+ }
+ fetchData();
+ };
+
+ const formStyle = {
+ width: '320px',
+ margin: '32px',
+ display: 'flex',
+ flexDirection: 'column',
+ };
+
+ return (
+ <form onSubmit={handleSubmit} style={formStyle}>
+ <input
+ value={email}
+ onChange={(e) => setEmail(e.target.value)}
+ placeholder="Email"
+ />
+ <input
+ password={password}
+ onChange={(e) => setPassword(e.target.value)}
+ placeholder="Password"
+ type="password"
+ />
+ <button type="submit">
+ {server.newServer ? 'Register' : 'Login'}
+ </button>
+ </form>
+ );
+ };
+
+ const MainScreen = ({ setUser }) => {
+ const mapContainer = React.useRef();
+ const map = React.useRef();
+
+ React.useEffect(() => {
+ map.current = new maplibregl.Map({
+ container: mapContainer.current,
+ style: 'https://demotiles.maplibre.org/style.json',
+ center: [0, 0],
+ zoom: 1,
+ });
+ }, []);
+
+ const [devices, setDevices] = React.useState([]);
+
+ React.useEffect(() => {
+ const fetchData = async () => {
+ const devicesResponse = await fetch('/api/devices');
+ if (devicesResponse.ok) {
+ setDevices(await devicesResponse.json());
+ }
+ }
+ fetchData();
+ }, []);
+
+ const [initialized, setInitialized] = React.useState(false);
+ const [positions, setPositions] = React.useState({});
+
+ React.useEffect(() => {
+ if (initialized) {
+ const url = window.location.protocol + '//' + window.location.host;
+ const socket = new WebSocket('ws' + url.substring(4) + '/api/socket');
+ socket.onmessage = (event) => {
+ const data = JSON.parse(event.data);
+ const updatedPositions = {};
+ data.positions?.forEach((p) => updatedPositions[p.deviceId] = p);
+ setPositions({ ...positions, ...updatedPositions })
+ };
+ }
+ }, [initialized]);
+
+ const handleAddDevice = (event) => {
+ event.preventDefault();
+ const fetchData = async () => {
+ const id = prompt('Enter device id');
+ const response = await fetch('/api/devices', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ name: id,
+ uniqueId: id,
+ }),
+ });
+ if (response.ok) {
+ setDevices([...devices, await response.json()]);
+ }
+ }
+ fetchData();
+ };
+
+ const handleLogout = (event) => {
+ event.preventDefault();
+ const fetchData = async () => {
+ await fetch('/api/session', { method: 'DELETE' });
+ setUser(null);
+ }
+ fetchData();
+ };
+
+ React.useEffect(() => {
+ map.current.on('load', () => {
+ map.current.addSource('points', {
+ type: 'geojson',
+ data: {
+ type: 'FeatureCollection',
+ features: [],
+ },
+ });
+ map.current.addLayer({
+ id: 'points',
+ type: 'circle',
+ source: 'points',
+ });
+ setInitialized(true);
+ });
+ }, []);
+
+ React.useEffect(() => {
+ map.current.getSource('points')?.setData({
+ type: 'FeatureCollection',
+ features: Object.values(positions).map((position) => ({
+ type: 'Feature',
+ geometry: {
+ type: 'Point',
+ coordinates: [position.longitude, position.latitude],
+ },
+ })),
+ });
+ }, [positions]);
+
+ const containerStyle = {
+ width: '100%',
+ height: '100%',
+ display: 'flex',
+ };
+ const deviceStyle = {
+ width: '320px',
+ marginTop: '16px',
+ };
+ const mapStyle = {
+ height: '100%',
+ flexGrow: 1,
+ };
+
+ return (
+ <div style={containerStyle}>
+ <div style={deviceStyle}>
+ <ul>
+ {devices?.map((device) => (<li key={device.id}>{device.name}</li>))}
+ <li><a href="#" onClick={handleAddDevice}>Add device</a></li>
+ <li><a href="#" onClick={handleLogout}>Logout</a></li>
+ </ul>
+ </div>
+ <div style={mapStyle} ref={mapContainer}></div>
+ </div>
+ );
+ };
+
+ const App = () => {
+ const [server, setServer] = React.useState();
+ const [user, setUser] = React.useState();
+
+ React.useEffect(() => {
+ const fetchData = async () => {
+ const serverResponse = await fetch('/api/server');
+ if (serverResponse.ok) {
+ setServer(await serverResponse.json());
+ }
+ const sessionResponse = await fetch('/api/session');
+ if (sessionResponse.ok) {
+ setUser(await sessionResponse.json());
+ }
+ }
+ fetchData();
+ }, []);
+
+ return user ? (
+ <MainScreen
+ setUser={setUser}
+ />
+ ) : server ? (
+ <LoginScreen
+ server={server}
+ setServer={setServer}
+ setUser={setUser}
+ />
+ ) : '';
+ };
+
+ ReactDOM.render(<App />, document.getElementById('content'));
+
+</script>
+</body>
+</html>